1. Introduction and Aims

We have merged the two datasets together in GCSKO_merge.Rmd. We also subsetted out the pre-sexual-branch and the sexual cells (male and female) and stored them in a Seurat object called tenx.mutant.integrated.sex. Here, we will perform pseudotime analysis on the dataset and build modules of genes that show similar expression across this pseudotime.

2. Read in the data

Load/Install the Required Packages

[1] "patchwork is loaded correctly"
[1] "viridis is loaded correctly"
[1] "Seurat is loaded correctly"
[1] "cowplot is loaded correctly"
[1] "gridExtra is loaded correctly"
[1] "grid is loaded correctly"
[1] "Hmisc is loaded correctly"
[1] "reshape2 is loaded correctly"
[1] "dplyr is loaded correctly"
[1] "circlize is loaded correctly"
[1] "monocle3 is loaded correctly"
[1] "destiny is loaded correctly"

load data

## load sex only branch cells saved from GCSKO_Sex_Branch_Analysis.Rmd
## Restore the objects
## load sex branch dataset
tenx.mutant.integrated.sex <- readRDS("../data_to_export/tenx.mutant.integrated.sex.RDS")
## load full dataset
#tenx.mutant.integrated <- readRDS("../data_to_export/tenx.mutant.integrated.RDS")
## create a list of our mutant gene IDs
list_of_mutant_genes <- c("PBANKA-0828000", "PBANKA-1302700", "PBANKA-1447900", "PBANKA-0102400", "PBANKA-0716500", "PBANKA-1435200", "PBANKA-1418100", "PBANKA-1144800", "PBANKA-0902300", "PBANKA-0413400", "PBANKA-1454800")

Read in gene annotations

gene_annotations <- read.table("../data/Reference/GenesByTaxon_Summary.csv", header = TRUE, sep = ",", stringsAsFactors = TRUE)
dim(gene_annotations)
[1] 5254    7
## convert _ to -
gene_annotations$Gene.ID <- gsub("_", "-", gene_annotations$Gene.ID)

3. Dimensionalty Reduction

We will now re-calculate the UMAP, PCA and diffusion map to visualise the data since the old visualisation used the variation in the whole dataset and so some of the variation in this set of cells was obscured.

ref: https://github.com/satijalab/seurat/issues/1883

A. Recalculate PCA

The PCA is used as the basis of other dimensionality reductions so we will now recalculate this to get to our final UMAP.

First, run PCA again

tenx.mutant.integrated.sex <- RunPCA(tenx.mutant.integrated.sex, npcs = 30, verbose = FALSE)

Then inspect the PCs

ElbowPlot(tenx.mutant.integrated.sex, ndims = 30, reduction = "pca")

Have a quick look at the output

DimPlot(tenx.mutant.integrated.sex, reduction = "pca", pt.size = 0.01, label = TRUE)
Using `as.character()` on a quosure is deprecated as of rlang 0.3.0.
Please use `as_label()` or `as_name()` instead.
This warning is displayed once per session.

And determine what is male and female:

FeaturePlot(tenx.mutant.integrated.sex, features = c("PBANKA-1319500", "PBANKA-0416100"), blend = TRUE, combine = TRUE, coord.fixed = TRUE, reduction = "pca")

## extract the cell embeddings from the pca
mds <- as.data.frame(tenx.mutant.integrated.sex@reductions$pca@cell.embeddings)

## change the coordinates of UMAP 1 so they are reversed
## take only the first two PCs
mds <- mds[ ,c("PC_1", "PC_2")]
mds$PC_1 <- -mds$PC_1
mds$PC_2 <- -mds$PC_2

## change names of the cols 
colnames(mds) <- paste0("DIM_PC_", 1:2)

## make into a matrix so that it can be saved in Seurat
mds <- as.matrix(mds)

## store this optimsed UMAP in a custom dim slot
tenx.mutant.integrated.sex[["DIM_PCA"]] <- CreateDimReducObject(embeddings = mds, key = "DIM_PCA_", assay = DefaultAssay(tenx.mutant.integrated.sex))
Keys should be one or more alphanumeric characters followed by an underscore, setting key from DIM_PCA_ to DIMPCA_All keys should be one or more alphanumeric characters followed by an underscore '_', setting key to DIMPCA_
## check
DimPlot(tenx.mutant.integrated.sex, label = TRUE, repel = FALSE, pt.size = 0.05, dims = c(1,2), reduction = "DIM_PCA") + coord_fixed()

Calculate new clusters

## generate new clusters at mid resolution
## 2
tenx.mutant.integrated.sex <- FindNeighbors(tenx.mutant.integrated.sex, dims = 1:11, reduction = "pca")
Computing nearest neighbor graph
Computing SNN
tenx.mutant.integrated.sex <- FindClusters(tenx.mutant.integrated.sex, resolution = 1, random.seed = 42, algorithm = 2)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 3012
Number of edges: 100398

Running Louvain algorithm with multilevel refinement...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8327
Number of communities: 17
Elapsed time: 0 seconds
## Plot
pca_plot <- DimPlot(tenx.mutant.integrated.sex, label = TRUE, repel = TRUE, pt.size = 0.5, dims = c(1,2), reduction = "DIM_PCA", group.by = "seurat_clusters") + coord_fixed() 
## view
HoverLocator(plot = pca_plot, information = FetchData(tenx.mutant.integrated.sex, vars = c("identity_combined", "seurat_clusters")))
`arrange_()` is deprecated as of dplyr 0.7.0.
Please use `arrange()` instead.
See vignette('programming') for more help
This warning is displayed once every 8 hours.
Call `lifecycle::last_warnings()` to see where this warning was generated.the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be used`error_y.color` does not currently support multiple values.`error_x.color` does not currently support multiple values.`line.color` does not currently support multiple values.The titlefont attribute is deprecated. Use title = list(font = ...) instead.the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be used`error_y.color` does not currently support multiple values.`error_x.color` does not currently support multiple values.`line.color` does not currently support multiple values.The titlefont attribute is deprecated. Use title = list(font = ...) instead.
umap_clusters <- DimPlot(tenx.mutant.integrated.sex, label = TRUE, repel = TRUE, pt.size = 0.5, dims = c(1,2), reduction = "DIM_PCA")+
  coord_fixed() +
      theme_void() + 
scale_color_discrete_qualitative(palette = "Dark 3")

umap_clusters

save

ggsave("../images_to_export/ALLCELLS_cluster_sex_branch_locations.png", plot = umap_clusters, device = "png", path = NULL, scale = 1, width = 10, height = 12, units = "cm", dpi = 300, limitsize = TRUE)
## make list of genotypes
list_of_genotypes <- unique(tenx.mutant.integrated.sex@meta.data$identity_combined)
## redorder for better plotting
list_of_genotypes <- list_of_genotypes[c(1, 3, 2, 4, 11, 7, 8, 12, 5, 10, 6, 9)]

## make a blank list
list_plots_sex_highlight <- vector(mode = "list", length = length(list_of_genotypes))

## for loop
for(i in seq_along(list_of_genotypes)){
    ## make a list of cells to highlight - but for wild-type, include all cells of that genotype, not just ones excluded for sex ratio
  if (grepl("wild-type", list_of_genotypes[i]) == FALSE) {
  list_of_cells <- rownames(tenx.mutant.integrated.sex@meta.data[which(tenx.mutant.integrated.sex@meta.data$identity_combined == list_of_genotypes[i] & tenx.mutant.integrated.sex@meta.data$exclude_for_sex_ratio == FALSE), ]) } else
  {list_of_cells <- rownames(tenx.mutant.integrated.sex@meta.data[which(tenx.mutant.integrated.sex@meta.data$identity_combined == list_of_genotypes[i]), ])}
  ## make a plot
  pca_plot <- DimPlot(tenx.mutant.integrated.sex, label = FALSE, repel = TRUE, pt.size = 0.1, cells.highlight = list_of_cells, dims = c(1,2), reduction = "DIM_PCA") + 
  coord_fixed() + 
  scale_color_manual(values=c("#E2E2E2", "#31206E")) + 
  theme_void() + 
  labs(title = paste(list_of_genotypes[i])) + 
  theme(plot.title = element_text(hjust = 0.5, family="Arial", size = 15, face = "bold.italic"), legend.position = "none")
  ## add to the list
  list_plots_sex_highlight[[i]] <- pca_plot
}
Scale for 'colour' is already present. Adding another scale for 'colour', which will replace the existing
scale.
Scale for 'colour' is already present. Adding another scale for 'colour', which will replace the existing
scale.
Scale for 'colour' is already present. Adding another scale for 'colour', which will replace the existing
scale.
Scale for 'colour' is already present. Adding another scale for 'colour', which will replace the existing
scale.
Scale for 'colour' is already present. Adding another scale for 'colour', which will replace the existing
scale.
Scale for 'colour' is already present. Adding another scale for 'colour', which will replace the existing
scale.
Scale for 'colour' is already present. Adding another scale for 'colour', which will replace the existing
scale.
Scale for 'colour' is already present. Adding another scale for 'colour', which will replace the existing
scale.
Scale for 'colour' is already present. Adding another scale for 'colour', which will replace the existing
scale.
Scale for 'colour' is already present. Adding another scale for 'colour', which will replace the existing
scale.
Scale for 'colour' is already present. Adding another scale for 'colour', which will replace the existing
scale.
Scale for 'colour' is already present. Adding another scale for 'colour', which will replace the existing
scale.

plot

## this function writes the next bit of code for you
## put it into the console and paste the response
#ploty <- c()
#for(i in seq_along(list_of_genotypes)){
#  ploty <- paste0(ploty, "list_plots_sex_highlight[[", i, "]]", " + ")
#}

## plot
composite_cell_locations <- plot_grid(list_plots_sex_highlight[[1]] + theme(plot.title = element_text(hjust = 0.5, family="Arial", size = 13, face = "bold"), legend.position = "none"), 
                                      list_plots_sex_highlight[[2]] + theme(plot.title = element_text(hjust = 0.5, family="Arial", size = 13, face = "bold"), legend.position = "none"), 
                                      list_plots_sex_highlight[[3]], 
                                      list_plots_sex_highlight[[4]], 
                                      list_plots_sex_highlight[[5]], 
                                      list_plots_sex_highlight[[6]], 
                                      list_plots_sex_highlight[[7]], 
                                      list_plots_sex_highlight[[8]], 
                                      list_plots_sex_highlight[[9]], 
                                      list_plots_sex_highlight[[10]], 
                                      list_plots_sex_highlight[[11]], 
                                      list_plots_sex_highlight[[12]], 
                                      nrow = 2)
font family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font database
composite_cell_locations

save

ggsave("../images_to_export/ALLCELLS_mutant_cell_locations.png", plot = composite_cell_locations, device = "png", path = NULL, scale = 1, width = 30, height = 20, units = "cm", dpi = 300, limitsize = TRUE)

Pseudotime

## make a new Seurat of this
seurat.object.sex <- tenx.mutant.integrated.sex

## extract counts and pheno:
## the reason we use the integrated and then subsetted is because these cells have been normalised whereas the cells in pb_sex_filtered have not been normalised (well they have but with doublets in them)
## with 10x only cells: all.equal(as.data.frame(counts(monocle.object)), as.data.frame(as.matrix(GetAssayData(seurat.object, assay = "RNA", slot = "counts")))) returns TRUE and also returns true when you change the slot input to "counts" and use monocle to norm it with method "log"
data <- as(as.matrix(GetAssayData(seurat.object.sex, assay = "RNA", slot = "counts")), 'sparseMatrix')
## make phenodata
pd <- data.frame(seurat.object.sex@meta.data)
## keep only the columns that are relevant in metadata
#pData <- pd %>% select(orig.ident, nCount_RNA, nFeature_RNA)
## make gene metadata
fData <- data.frame(gene_short_name = row.names(data), row.names = row.names(data))

## Construct monocle cds
monocle.object.sex <- new_cell_data_set(expression_data = data, cell_metadata = pd, gene_metadata = fData)

## preprocess
monocle.object.sex = preprocess_cds(monocle.object.sex, num_dim = 50, norm_method = "log")
### if using integrated data:
# norm_method = "none", alignment_group = "~ experiment"

## plot jack straw plot
#plot_pc_variance_explained(monocle.object)

#monocle.object = reduce_dimension(monocle.object, reduction_method = "UMAP", preprocess_method = "PCA", umap.metric = "euclidean", umap.n_neighbors = 50, umap.min_dist = 0.5, verbose = FALSE)

#plot_cells(monocle.object, color_cells_by="experiment")

## graph learning

## add UMAP from Seurat
monocle.object.sex@int_colData@listData$reducedDims@listData[["UMAP"]] <- seurat.object.sex@reductions[["DIM_PCA"]]@cell.embeddings
## if you want the old UMAP from the original all cells one, use: "DIM_UMAP"

## cluster
## this is essential to run the learn_graph function later on
monocle.object.sex = cluster_cells(monocle.object.sex)

## plot initial clustering by monocle
#plot_cells(monocle.object, color_cells_by="cluster", group_cells_by="partition", x = 2, y = 1)

## map pseudotime
monocle.object.sex = learn_graph(monocle.object.sex, learn_graph_control=list(ncenter=200, minimal_branch_len = 10), use_partition = FALSE)

  |                                                                                                        
  |                                                                                                  |   0%
  |                                                                                                        
  |==================================================================================================| 100%
# learn_graph_control=list(ncenter=500) - play with this parameter - lower tends to give fewer branches and higher tends to give more
# 500 - old analysis
# 250 - new analysis 

##200

## Plot cells
plot_cells(monocle.object.sex, color_cells_by="post_integration_clusters", group_cells_by="partition", x = 1, y = 2)
`select_()` is deprecated as of dplyr 0.7.0.
Please use `select()` instead.
This warning is displayed once every 8 hours.
Call `lifecycle::last_warnings()` to see where this warning was generated.The `add` argument of `group_by()` is deprecated as of dplyr 1.0.0.
Please use the `.add` argument instead.
This warning is displayed once every 8 hours.
Call `lifecycle::last_warnings()` to see where this warning was generated.

Redefine the identities of the male and female cells

male

monocle.object_male <- choose_graph_segments(monocle.object.sex)

female

monocle.object_female <- choose_graph_segments(monocle.object.sex)

bipotential

monocle.object_bipot <- choose_graph_segments(monocle.object.sex)

check

df_freq <- data.frame(table(c(colnames(monocle.object_male), colnames(monocle.object_female), colnames(monocle.object_bipot))))
paste("number of cells in seurat object is", length(colnames(monocle.object.sex)), ". The number of cells selected here with an identitity is", dim(df_freq)[1])
[1] "number of cells in seurat object is 3012 . The number of cells selected here with an identitity is 3012"
df_freq <- df_freq[df_freq$Freq > 1, ]
df_freq

Inspect where these missing cells are:

# '%ni%' <- Negate('%in%')
# 
# not_assigned_cells <- colnames(monocle.object)[colnames(monocle.object) %ni% c(colnames(monocle.object_male), colnames(monocle.object_female), colnames(monocle.object_bipot), colnames(monocle.object_asex), colnames(monocle.object_asex_fate))]
# 
# DimPlot(seurat.object, repel = TRUE, label.size = 5, pt.size = 0.5, cells.highlight = not_assigned_cells, dims = c(2,1), reduction = "DIM_UMAP") +
#   coord_fixed() + 
#   scale_color_manual(values=c("#000000", "#f54e1e"))
## raw numbers for each identity
table(monocle.object_male@colData$identity_combined)

                   fd1                    fd2                    fd3                    fd4 
                    65                     54                     14                     45 
                   gd1                    md3                    md4                    md5 
                    37                     44                     15                    112 
       wild-type (10x) wild-type (Smart-seq2) 
                   185                    217 
table(monocle.object_female@colData$identity_combined)

                   fd1                    fd2                    fd3                    fd4 
                    24                     64                     19                     23 
                   gd1                    md1                    md2                    md3 
                    25                    128                    205                     90 
                   md4                    md5        wild-type (10x) wild-type (Smart-seq2) 
                    15                     24                    246                    198 
table(monocle.object_bipot@colData$identity_combined)

                   fd1                    fd2                    fd3                    fd4 
                     2                      1                      8                      1 
                   gd1                    md1                    md2                    md3 
                    36                      9                      4                     20 
                   md4        wild-type (10x) wild-type (Smart-seq2) 
                     6                   1063                     13 
## remove cells not sorted unbiasedly
table(monocle.object_male@colData[monocle.object_male@colData$exclude_for_sex_ratio == FALSE & !is.na(monocle.object_male@colData$exclude_for_sex_ratio), ]$identity_combined)

                   fd1                    fd2                    fd3                    fd4 
                    26                     54                     14                     45 
                   gd1                    md4                    md5 wild-type (Smart-seq2) 
                    37                     15                    112                    122 
table(monocle.object_female@colData[monocle.object_female@colData$exclude_for_sex_ratio == FALSE & !is.na(monocle.object_female@colData$exclude_for_sex_ratio), ]$identity_combined)

                   fd1                    fd2                    fd3                    fd4 
                     9                     64                     19                     23 
                   gd1                    md1                    md2                    md3 
                    25                     69                    140                     87 
                   md4                    md5 wild-type (Smart-seq2) 
                    15                     24                     95 
table(monocle.object_bipot@colData[monocle.object_bipot@colData$exclude_for_sex_ratio == FALSE & !is.na(monocle.object_bipot@colData$exclude_for_sex_ratio), ]$identity_combined)

                   fd1                    fd2                    fd3                    fd4 
                     2                      1                      8                      1 
                   gd1                    md1                    md2                    md3 
                    36                      9                      4                     12 
                   md4 wild-type (Smart-seq2) 
                     6                     13 
## correct for clusters
m_meta <- monocle.object_male@colData
m_meta <- m_meta[m_meta$exclude_for_sex_ratio == FALSE & !is.na(m_meta$exclude_for_sex_ratio), ]
m_meta <- m_meta[which(m_meta$seurat_clusters %in% c(5, 10, 4, 9, 12, 16)), ]
table(m_meta$identity_combined)

                   fd1                    fd2                    fd3                    fd4 
                    26                     54                     14                     45 
                   gd1                    md4                    md5 wild-type (Smart-seq2) 
                    33                     15                    110                    122 
f_meta <- monocle.object_female@colData
f_meta <- f_meta[f_meta$exclude_for_sex_ratio == FALSE & !is.na(f_meta$exclude_for_sex_ratio), ]
f_meta <- f_meta[which(f_meta$seurat_clusters %in% c(14, 15, 13, 8, 11, 7, 0)), ]
table(f_meta$identity_combined)

                   fd1                    fd2                    fd3                    fd4 
                     8                     62                     19                     23 
                   gd1                    md1                    md2                    md3 
                     1                     68                    140                     85 
                   md4                    md5 wild-type (Smart-seq2) 
                    15                     24                     93 
b_meta <- monocle.object_bipot@colData
b_meta <- b_meta[b_meta$exclude_for_sex_ratio == FALSE & !is.na(b_meta$exclude_for_sex_ratio), ]
b_meta <- b_meta[which(b_meta$seurat_clusters %in% c(1, 2, 3, 6)), ]
table(b_meta$identity_combined)

                   fd1                    fd2                    fd3                    fd4 
                     2                      1                      8                      1 
                   gd1                    md1                    md2                    md3 
                    31                      9                      4                     12 
                   md4 wild-type (Smart-seq2) 
                     5                     13 
## create annotation dataframe from these results:
df_monocle_sexes <- rbind(data.frame("cell_name" = colnames(monocle.object_male), "sex" = rep("Male", length(colnames(monocle.object_male)))),
                          data.frame("cell_name" = colnames(monocle.object_female), "sex" = rep("Female", length(colnames(monocle.object_female)))),
                          data.frame("cell_name" = colnames(monocle.object_bipot), "sex" = rep("Bipotential", length(colnames(monocle.object_bipot))))
                          )

dim(df_monocle_sexes)
[1] 3012    2
## order like the metadata
df_monocle_sexes <- df_monocle_sexes[match(rownames(monocle.object.sex@colData), df_monocle_sexes$cell_name), ]

## add this back into the monocle object
monocle.object.sex@colData$Sexes_monocle <- df_monocle_sexes$sex

Pseudotime Calculation

## Order the cells and calculate pseudotime
monocle.object.sex = order_cells(monocle.object.sex)

Listening on http://127.0.0.1:7205
## Plot
umap_pt <- plot_cells(monocle.object.sex, color_cells_by = "pseudotime", label_cell_groups=FALSE, cell_size = 1, x = 1, y = 2, label_branch_points=FALSE, label_leaves=FALSE, label_groups_by_cluster=FALSE, label_roots = FALSE) +
  coord_fixed() +
  theme_void() +
  labs(title = "Pseudotime") +
  theme(plot.title = element_text(hjust = 0.5, size=15), legend.position="right", legend.title=element_text (size=10), legend.text=element_text(size=10)) + 
  guides(colour = guide_colourbar(barwidth = 0.5, barheight = 10, title = "Pseudotime"))

## view
umap_pt

add pt to monocle

## extract pt values
pt_values <- as.data.frame(pseudotime(monocle.object.sex, reduction_method = "UMAP"))

## add to monocle
monocle.object.sex@colData$pseudotime <- pt_values[ ,1]


## add to seurat
#tenx.mutant.integrated.sex <- AddMetaData(tenx.mutant.integrated.sex, pt_values, "pt_values")
## plot
##extract pt values
df_pt_id <- monocle.object.sex@colData[,c("pseudotime", "Sexes_monocle")]
## extract UMAP coords
df_umap_plot <- tenx.mutant.integrated.sex@reductions[["DIM_PCA"]]@cell.embeddings
df_umap_plot <- merge(df_umap_plot, df_pt_id, by=0, all=TRUE)

## add tree
##The tree for monocle is located here:
# monocle.object@principal_graph_aux[["UMAP"]]$dp_mst 
ica_space_df <- t(monocle.object.sex@principal_graph_aux[["UMAP"]]$dp_mst) %>%
      as.data.frame() %>%
      dplyr::select_(prin_graph_dim_1 = "DIMPCA_1", prin_graph_dim_2 = "DIMPCA_2") %>%
      dplyr::mutate(sample_name = rownames(.),
                    sample_state = rownames(.))

dp_mst <- monocle.object.sex@principal_graph[["UMAP"]]

edge_df <- dp_mst %>%
      igraph::as_data_frame() %>%
      dplyr::select_(source = "from", target = "to") %>%
      dplyr::left_join(ica_space_df %>%
                         dplyr::select_(
                           source="sample_name",
                           source_prin_graph_dim_1="prin_graph_dim_1",
                           source_prin_graph_dim_2="prin_graph_dim_2"),
                       by = "source") %>%
      dplyr::left_join(ica_space_df %>%
                         dplyr::select_(
                           target="sample_name",
                           target_prin_graph_dim_1="prin_graph_dim_1",
                           target_prin_graph_dim_2="prin_graph_dim_2"),
                       by = "target")

## make ggplot
umap_id_pt <- ggplot(df_umap_plot, aes(x = DIMPCA_1, y = DIMPCA_2)) + 
                     geom_point(aes(color = pseudotime), size = 0.1) +
                     scale_colour_viridis(option = "plasma") +
                     theme_void() +
                     coord_fixed() +
                     geom_segment(aes_string(x="source_prin_graph_dim_1",
                                     y="source_prin_graph_dim_2",
                                     xend="target_prin_graph_dim_1",
                                     yend="target_prin_graph_dim_2"),
                          data=edge_df) +
                     theme(plot.title = element_text(hjust = 0.5, family="Arial", size = 13, face = "bold")) +
                     labs(title = "Pseudotime")

umap_id_pt

plot of cell identity:

## extract meta data
df_pca <-tenx.mutant.integrated.sex@meta.data
## make new col
df_pca$assignment <- "unassigned"

## now add other annotations
## correct for clusters
## the problem with this approach is that cells that are na for unbiased sorting are excluded
#df_pca$assignment[which(rownames(df_pca) %in% rownames(m_meta))] <- "male"
#df_pca$assignment[which(rownames(df_pca) %in% rownames(f_meta))] <- "female"
#df_pca$assignment[which(rownames(df_pca) %in% rownames(b_meta))] <- "bipoential"
## correct for clusters
m_meta_2 <- monocle.object_male@colData
m_meta_2 <- m_meta_2[which(m_meta_2$seurat_clusters %in% c(5, 10, 4, 9, 12, 16)), ]

f_meta_2 <- monocle.object_female@colData
f_meta_2 <- f_meta_2[which(f_meta_2$seurat_clusters %in% c(14, 15, 13, 8, 11, 7, 0)), ]

b_meta_2 <- monocle.object_bipot@colData
b_meta_2 <- b_meta_2[which(b_meta_2$seurat_clusters %in% c(1, 2, 3, 6)), ]

df_pca$assignment[which(rownames(df_pca) %in% rownames(m_meta_2))] <- "male"
df_pca$assignment[which(rownames(df_pca) %in% rownames(f_meta_2))] <- "female"
df_pca$assignment[which(rownames(df_pca) %in% rownames(b_meta_2))] <- "progenitor"

## add back to meta data
tenx.mutant.integrated.sex <- AddMetaData(tenx.mutant.integrated.sex, df_pca$assignment, col.name = "assignment")

## remove these objects to save space
rm(m_meta_2, f_meta_2, b_meta_2)

## make a custom pal
# 1 = blue - "#0052c5"
# 2 = red - "#a52b1e"
# 3 = green - "#016c00"
# 4 = yellow - "#ffe400"
pal_sex <- c("#016c00", "#a52b1e", "#ffe400", "#E7E8EA")

UMAP_identity <- DimPlot(tenx.mutant.integrated.sex, label = FALSE, repel = TRUE, pt.size = 0.5, group.by = "assignment", dims = c(1,2), reduction = "DIM_PCA") +
  coord_fixed() + 
  scale_colour_manual(values=pal_sex) + 
  theme_void() + 
  #theme(legend.position = "none")
  ## add sex symbols
  annotate("text", x = 30, y = -50, label = male_symbol, size=7, color="#a52b1e") + 
  annotate("text", x = 50, y = -10, label = female_symbol, size=7, color="#016c00") +
  labs(title = '')

## print
UMAP_identity

plot pseudotime vs. genotype

## extract sexes
male_df <- as.data.frame(monocle.object.sex@colData[which(monocle.object.sex@colData$Sexes_monocle == "Male"), ])
female_df <- as.data.frame(monocle.object.sex@colData[which(monocle.object.sex@colData$Sexes_monocle == "Female"), ])

## then only include cells that are:
## 1. unbiasedly sorted
## 2. in the right cluster
female_df <- female_df[female_df$exclude_for_sex_ratio == FALSE | is.na(female_df$exclude_for_sex_ratio), ]
female_df <- female_df[which(female_df$seurat_clusters %in% c(14, 15, 13, 8, 11, 7, 0)), ]
male_df <- male_df[male_df$exclude_for_sex_ratio == FALSE | is.na(male_df$exclude_for_sex_ratio), ]
male_df <- male_df[which(male_df$seurat_clusters %in% c(5, 10, 4, 9, 12, 16)), ]

## define the dataframes
male_df$identity_combined <- factor(male_df$identity_combined, levels = rev(c("md1", "md2", "md3", "md4", "md5", "gd1", "fd1", "fd2", "fd3", "fd4",  "wild-type (10x)", "wild-type (Smart-seq2)")))
female_df$identity_combined <- factor(female_df$identity_combined, levels = rev(c("md1", "md2", "md3", "md4", "md5", "gd1", "fd1", "fd2", "fd3", "fd4", "wild-type (10x)", "wild-type (Smart-seq2)")))
library(ggridges)
## plot females 
p1 <- ggplot(female_df, aes(x = pseudotime, y =  identity_combined, fill = stat(x))) +
  geom_density_ridges_gradient(scale = 0.9, rel_min_height = 0.03,  quantile_lines = TRUE, quantiles = 2, point_alpha = 0.5, alpha = 0.8) +
  theme_classic() +
  scale_y_discrete(drop=FALSE) +
  labs(title = 'Female', x = "Female Branch Pseudotime", y = "Genotype") +
  scale_fill_viridis_c(name = "pseudotime", option = "C", alpha = 1) +
  theme(legend.position = "none", 
        panel.grid.major.y = element_line(size = (0.2), colour="grey"),
        axis.title.x=element_blank())

## plot males
p2 <- ggplot(male_df, aes(x = pseudotime, y =  identity_combined, fill = stat(x))) +
  geom_density_ridges_gradient(scale = 0.9, rel_min_height = 0.03,  quantile_lines = TRUE, quantiles = 2, point_alpha = 0.5, alpha = 0.8, na.rm = FALSE)  +
  theme_classic() +
  scale_y_discrete(drop=FALSE) +
  labs(title = 'Male', x = "Male Branch Pseudotime") +
  scale_fill_viridis_c(name = "pseudotime", option = "C", alpha = 1) +
  theme(legend.position = "none",
        panel.grid.major.y = element_line(size = (0.2), colour="grey"),
        axis.title.x=element_blank(),
        axis.title.y=element_blank(),
        axis.text.y=element_blank(),
        axis.ticks.y=element_blank())

plot_grid(p1, p2, nrow = 1, align = "h", axis = "b")
Picking joint bandwidth of 4.78
Picking joint bandwidth of 2.58

#library(egg)
#egg::ggarrange(p1, p2,  nrow = 1)

#grid.newpage()
#grid.draw(cbind(ggplotGrob(p1), ggplotGrob(p2), size = "last"))
combined_df <- rbind(male_df, female_df)

combined_ridge_plots <- ggplot(combined_df, aes(x = pseudotime, y =  identity_combined, fill = stat(x))) +
  geom_density_ridges_gradient(scale = 0.9, rel_min_height = 0.03,  quantile_lines = TRUE, quantiles = 2, point_alpha = 0.5, alpha = 0.8) +
  theme_classic() +
  scale_y_discrete(drop=FALSE) +
  labs(title = '', x = "Pseudotime", y = "") +
  scale_fill_viridis_c(name = "pseudotime", option = "C", alpha = 1) +
  theme(legend.position = "none", 
        panel.grid.major.y = element_line(size = (0.2), colour="grey"),
        axis.title.x=element_blank()) + 
  facet_grid(cols = vars(Sexes_monocle))

combined_ridge_plots

library(gridExtra)

combined_df <- rbind(male_df, female_df)
x <- as.data.frame(as.matrix.data.frame(table(combined_df$Sexes_monocle, combined_df$identity_combined)))
colnames(x) <- colnames(as.matrix(table(combined_df$Sexes_monocle, combined_df$identity_combined)))
rownames(x) <- rownames(as.matrix(table(combined_df$Sexes_monocle, combined_df$identity_combined)))
## transform
x <- t(x)
## reverse order of rows to match plots
x<- x[seq(dim(x)[1],1),]
ss <- tableGrob(x, theme = ttheme_minimal(base_family = "Arial"), rows=NULL)
grid.arrange(ss)

plot_grid(combined_ridge_plots, ss, nrow = 1, rel_widths = c(3, 1))
Picking joint bandwidth of 4.78
Picking joint bandwidth of 2.58

## A
composite_cell_locations <- plot_grid((UMAP_identity + labs(title=" ") + theme(plot.title = element_text(hjust = 0.5, family="Arial", size = 12, face = "bold"), legend.position = "none")),
                                      (umap_id_pt + theme(legend.position = "none")), 
                                      list_plots_sex_highlight[[3]], 
                                      list_plots_sex_highlight[[4]], 
                                      list_plots_sex_highlight[[5]], 
                                      list_plots_sex_highlight[[6]], 
                                      list_plots_sex_highlight[[7]], 
                                      list_plots_sex_highlight[[8]], 
                                      list_plots_sex_highlight[[9]], 
                                      list_plots_sex_highlight[[10]], 
                                      list_plots_sex_highlight[[11]], 
                                      list_plots_sex_highlight[[12]],
                                      (list_plots_sex_highlight[[1]] + theme(plot.title = element_text(hjust = 0.5, family="Arial", size = 12, face = "bold"), plot.subtitle = element_text(hjust = 0.5, family="Arial", size = 12, face = "bold"), legend.position = "none") + labs(title="wild-type", subtitle="(10x)")), 
                                      (list_plots_sex_highlight[[2]] + theme(plot.title = element_text(hjust = 0.5, family="Arial", size = 12, face = "bold"), plot.subtitle = element_text(hjust = 0.5, family="Arial", size = 12, face = "bold"), legend.position = "none") + labs(title="wild-type", subtitle="(Smart-seq2)")), 
                                      nrow = 2,
                                      axis = c("b")
                                      )
font family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font databasefont family 'Arial' not found in PostScript font database
B <- plot_grid(combined_ridge_plots, ss, nrow = 1, rel_widths = c(3, 1))
Picking joint bandwidth of 4.78
Picking joint bandwidth of 2.58
## labels as uppercase letters:
#c(toupper(letters)[2:17])
# labels as roman numerals:
# c(tolower(as.roman(c(2:17))

Figure_publication <- plot_grid(composite_cell_locations, 
                                B,
                                ## add empty plot to give spacing
                                (ggplot() + theme_void()),
                                labels = c('', ''), 
                                label_size = 12, 
                                ncol = 1, 
                                nrow=3, 
                                rel_heights = c(1, 1, 1), 
                                rel_widths = c(1, 1, 1))

#ggdraw() +
#  draw_plot(composite_cell_locations, 0, .5, 1, .5) +
#  draw_plot(combined_ridge_plots, 0, 0, .5, .5) +
#  draw_plot(ss, .5, 0, .5, .5)

Figure_publication

save

ggsave("../images_to_export/Figure_4.png", plot = Figure_publication, device = "png", path = NULL, scale = 1, width = 21, height = 29.7, units = "cm", dpi = 300, limitsize = TRUE)

Differential expression

table(tenx.mutant.integrated.sex@meta.data$identity_combined, tenx.mutant.integrated.sex$seurat_clusters)
                        
                           0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16
  fd1                      0   0   1   1  28  31   0   0  22   2   2   0   0   1   0   0   3
  fd2                      0   0   0   1  15  30   2   0   2   3   6   0   0   0   3  57   0
  fd3                      9   5   1   2   7   5   0   5   0   2   0   5   0   0   0   0   0
  fd4                     11   0   1   0  24  14   0   9   2   4   3   1   0   0   0   0   0
  gd1                      0  17   4   8   0   0  14   0   0   0   0   0  25   0   1   0  29
  md1                     66   4   2   3   0   0   0  42   4   0   0   4   0  11   0   0   1
  md2                    102   3   0   1   0   0   0  55   1   0   0   4   0  42   0   1   0
  md3                     19  10   5   6  28   2   2   6  50   2   2  11   1   1   0   0   9
  md4                      7   1   2   1   0   0   1   7   0   0   0   1  16   0   0   0   0
  md5                     15   0   0   0   1   0   2   1   4  58  45   4   2   0   0   0   4
  wild-type (10x)         80 325 341 266  42  42 169   6  31  31  20  36  34   1  65   3   2
  wild-type (Smart-seq2)  84   4   2   6 118  73   4  54  24   9  10  15   1  18   0   1   5

ggsave("../images_to_export/DE_table.png", plot = de_table, device = "png", path = NULL, scale = 1, width = 20, height = 30, units = "cm", dpi = 300, limitsize = TRUE)

From this, we should compare differential expression as such:

md3 - 4 md4 - 12 md5 - 10 gd1 - 12 or 16 (seems to be it’s own cluster)? fd1 - 8 fd2 - has it’s own cluster of 15 - compare 15 to 8 fd3 - 0 - not many cells fd4 - 0 - not many cells * for fd3 and fd4 you could do other clusters and look at changes along dev.

Things to look for:

  1. is the expression of the marker (in mutants that make it to the end of gametocytogenesis) in the 820 lines disturbed?
  2. Are any of the other screen hits disturbed?
  3. What is the enrichment of these genes in

md3

cells.4 <- subset(tenx.mutant.integrated.sex, idents = "4")
Idents(cells.4) <- "identity_combined"
md3_markers <- FindMarkers(cells.4, ident.1 = "md3", ident.2 = c("wild-type (10x)", "wild-type (Smart-seq2)"), test.use = "MAST", verbose = FALSE)
Assuming data assay in position 1, with name et is log-transformed.

 Completed [=>----------------------------------------------------------------------------------------------------]   2% with 0 failures
 Completed [==>---------------------------------------------------------------------------------------------------]   2% with 0 failures
 Completed [==>---------------------------------------------------------------------------------------------------]   3% with 0 failures
 Completed [===>--------------------------------------------------------------------------------------------------]   3% with 0 failures
 Completed [===>--------------------------------------------------------------------------------------------------]   4% with 0 failures
 Completed [====>-------------------------------------------------------------------------------------------------]   4% with 0 failures
 Completed [====>-------------------------------------------------------------------------------------------------]   5% with 0 failures
 Completed [=====>------------------------------------------------------------------------------------------------]   5% with 0 failures
 Completed [=====>------------------------------------------------------------------------------------------------]   6% with 0 failures
 Completed [======>-----------------------------------------------------------------------------------------------]   6% with 0 failures
 Completed [======>-----------------------------------------------------------------------------------------------]   7% with 0 failures
 Completed [=======>----------------------------------------------------------------------------------------------]   7% with 0 failures
 Completed [=======>----------------------------------------------------------------------------------------------]   8% with 0 failures
 Completed [========>---------------------------------------------------------------------------------------------]   8% with 0 failures
 Completed [========>---------------------------------------------------------------------------------------------]   9% with 0 failures
 Completed [=========>--------------------------------------------------------------------------------------------]   9% with 0 failures
 Completed [=========>--------------------------------------------------------------------------------------------]  10% with 0 failures
 Completed [==========>-------------------------------------------------------------------------------------------]  10% with 0 failures
 Completed [==========>-------------------------------------------------------------------------------------------]  11% with 0 failures
 Completed [===========>------------------------------------------------------------------------------------------]  11% with 0 failures
 Completed [===========>------------------------------------------------------------------------------------------]  12% with 0 failures
 Completed [============>-----------------------------------------------------------------------------------------]  12% with 0 failures
 Completed [============>-----------------------------------------------------------------------------------------]  13% with 0 failures
 Completed [=============>----------------------------------------------------------------------------------------]  13% with 0 failures
 Completed [=============>----------------------------------------------------------------------------------------]  14% with 0 failures
 Completed [==============>---------------------------------------------------------------------------------------]  14% with 0 failures
 Completed [==============>---------------------------------------------------------------------------------------]  15% with 0 failures
 Completed [===============>--------------------------------------------------------------------------------------]  15% with 0 failures
 Completed [===============>--------------------------------------------------------------------------------------]  16% with 0 failures
 Completed [================>-------------------------------------------------------------------------------------]  16% with 0 failures
 Completed [================>-------------------------------------------------------------------------------------]  17% with 0 failures
 Completed [=================>------------------------------------------------------------------------------------]  17% with 0 failures
 Completed [=================>------------------------------------------------------------------------------------]  18% with 0 failures
 Completed [==================>-----------------------------------------------------------------------------------]  18% with 0 failures
 Completed [==================>-----------------------------------------------------------------------------------]  19% with 0 failures
 Completed [===================>----------------------------------------------------------------------------------]  19% with 0 failures
 Completed [===================>----------------------------------------------------------------------------------]  20% with 0 failures
 Completed [====================>---------------------------------------------------------------------------------]  20% with 0 failures
 Completed [====================>---------------------------------------------------------------------------------]  21% with 0 failures
 Completed [=====================>--------------------------------------------------------------------------------]  21% with 0 failures
 Completed [=====================>--------------------------------------------------------------------------------]  22% with 0 failures
 Completed [======================>-------------------------------------------------------------------------------]  22% with 0 failures
 Completed [======================>-------------------------------------------------------------------------------]  23% with 0 failures
 Completed [=======================>------------------------------------------------------------------------------]  23% with 0 failures
 Completed [=======================>------------------------------------------------------------------------------]  24% with 0 failures
 Completed [========================>-----------------------------------------------------------------------------]  24% with 0 failures
 Completed [========================>-----------------------------------------------------------------------------]  25% with 0 failures
 Completed [=========================>----------------------------------------------------------------------------]  25% with 0 failures
 Completed [=========================>----------------------------------------------------------------------------]  26% with 0 failures
 Completed [==========================>---------------------------------------------------------------------------]  26% with 0 failures
 Completed [==========================>---------------------------------------------------------------------------]  27% with 0 failures
 Completed [===========================>--------------------------------------------------------------------------]  27% with 0 failures
 Completed [===========================>--------------------------------------------------------------------------]  28% with 0 failures
 Completed [============================>-------------------------------------------------------------------------]  28% with 0 failures
 Completed [============================>-------------------------------------------------------------------------]  29% with 0 failures
 Completed [=============================>------------------------------------------------------------------------]  29% with 0 failures
 Completed [=============================>------------------------------------------------------------------------]  30% with 0 failures
 Completed [==============================>-----------------------------------------------------------------------]  30% with 0 failures
 Completed [==============================>-----------------------------------------------------------------------]  31% with 0 failures
 Completed [===============================>----------------------------------------------------------------------]  31% with 0 failures
 Completed [===============================>----------------------------------------------------------------------]  32% with 0 failures
 Completed [================================>---------------------------------------------------------------------]  32% with 0 failures
 Completed [================================>---------------------------------------------------------------------]  33% with 0 failures
 Completed [=================================>--------------------------------------------------------------------]  33% with 0 failures
 Completed [=================================>--------------------------------------------------------------------]  34% with 0 failures
 Completed [==================================>-------------------------------------------------------------------]  34% with 0 failures
 Completed [==================================>-------------------------------------------------------------------]  35% with 0 failures
 Completed [===================================>------------------------------------------------------------------]  35% with 0 failures
 Completed [===================================>------------------------------------------------------------------]  36% with 0 failures
 Completed [====================================>-----------------------------------------------------------------]  36% with 0 failures
 Completed [====================================>-----------------------------------------------------------------]  37% with 0 failures
 Completed [=====================================>----------------------------------------------------------------]  37% with 0 failures
 Completed [=====================================>----------------------------------------------------------------]  38% with 0 failures
 Completed [======================================>---------------------------------------------------------------]  38% with 0 failures
 Completed [======================================>---------------------------------------------------------------]  39% with 0 failures
 Completed [=======================================>--------------------------------------------------------------]  39% with 0 failures
 Completed [=======================================>--------------------------------------------------------------]  40% with 0 failures
 Completed [========================================>-------------------------------------------------------------]  40% with 0 failures
 Completed [========================================>-------------------------------------------------------------]  41% with 0 failures
 Completed [=========================================>------------------------------------------------------------]  41% with 0 failures
 Completed [=========================================>------------------------------------------------------------]  42% with 0 failures
 Completed [==========================================>-----------------------------------------------------------]  42% with 0 failures
 Completed [==========================================>-----------------------------------------------------------]  43% with 0 failures
 Completed [===========================================>----------------------------------------------------------]  43% with 0 failures
 Completed [===========================================>----------------------------------------------------------]  44% with 0 failures
 Completed [============================================>---------------------------------------------------------]  44% with 0 failures
 Completed [============================================>---------------------------------------------------------]  45% with 0 failures
 Completed [=============================================>--------------------------------------------------------]  45% with 0 failures
 Completed [=============================================>--------------------------------------------------------]  46% with 0 failures
 Completed [==============================================>-------------------------------------------------------]  46% with 0 failures
 Completed [==============================================>-------------------------------------------------------]  47% with 0 failures
 Completed [===============================================>------------------------------------------------------]  47% with 0 failures
 Completed [===============================================>------------------------------------------------------]  48% with 0 failures
 Completed [================================================>-----------------------------------------------------]  48% with 0 failures
 Completed [=================================================>----------------------------------------------------]  49% with 0 failures
 Completed [==================================================>---------------------------------------------------]  50% with 0 failures
 Completed [===================================================>--------------------------------------------------]  51% with 0 failures
 Completed [====================================================>-------------------------------------------------]  52% with 0 failures
 Completed [=====================================================>------------------------------------------------]  52% with 0 failures
 Completed [=====================================================>------------------------------------------------]  53% with 0 failures
 Completed [======================================================>-----------------------------------------------]  53% with 0 failures
 Completed [======================================================>-----------------------------------------------]  54% with 0 failures
 Completed [=======================================================>----------------------------------------------]  54% with 0 failures
 Completed [=======================================================>----------------------------------------------]  55% with 0 failures
 Completed [========================================================>---------------------------------------------]  55% with 0 failures
 Completed [========================================================>---------------------------------------------]  56% with 0 failures
 Completed [=========================================================>--------------------------------------------]  56% with 0 failures
 Completed [=========================================================>--------------------------------------------]  57% with 0 failures
 Completed [==========================================================>-------------------------------------------]  57% with 0 failures
 Completed [==========================================================>-------------------------------------------]  58% with 0 failures
 Completed [===========================================================>------------------------------------------]  58% with 0 failures
 Completed [===========================================================>------------------------------------------]  59% with 0 failures
 Completed [============================================================>-----------------------------------------]  59% with 0 failures
 Completed [============================================================>-----------------------------------------]  60% with 0 failures
 Completed [=============================================================>----------------------------------------]  60% with 0 failures
 Completed [=============================================================>----------------------------------------]  61% with 0 failures
 Completed [==============================================================>---------------------------------------]  61% with 0 failures
 Completed [==============================================================>---------------------------------------]  62% with 0 failures
 Completed [===============================================================>--------------------------------------]  62% with 0 failures
 Completed [===============================================================>--------------------------------------]  63% with 0 failures
 Completed [================================================================>-------------------------------------]  63% with 0 failures
 Completed [================================================================>-------------------------------------]  64% with 0 failures
 Completed [=================================================================>------------------------------------]  64% with 0 failures
 Completed [=================================================================>------------------------------------]  65% with 0 failures
 Completed [==================================================================>-----------------------------------]  65% with 0 failures
 Completed [==================================================================>-----------------------------------]  66% with 0 failures
 Completed [===================================================================>----------------------------------]  66% with 0 failures
 Completed [===================================================================>----------------------------------]  67% with 0 failures
 Completed [====================================================================>---------------------------------]  67% with 0 failures
 Completed [====================================================================>---------------------------------]  68% with 0 failures
 Completed [=====================================================================>--------------------------------]  68% with 0 failures
 Completed [=====================================================================>--------------------------------]  69% with 0 failures
 Completed [======================================================================>-------------------------------]  69% with 0 failures
 Completed [======================================================================>-------------------------------]  70% with 0 failures
 Completed [=======================================================================>------------------------------]  70% with 0 failures
 Completed [=======================================================================>------------------------------]  71% with 0 failures
 Completed [========================================================================>-----------------------------]  71% with 0 failures
 Completed [========================================================================>-----------------------------]  72% with 0 failures
 Completed [=========================================================================>----------------------------]  72% with 0 failures
 Completed [=========================================================================>----------------------------]  73% with 0 failures
 Completed [==========================================================================>---------------------------]  73% with 0 failures
 Completed [==========================================================================>---------------------------]  74% with 0 failures
 Completed [===========================================================================>--------------------------]  74% with 0 failures
 Completed [===========================================================================>--------------------------]  75% with 0 failures
 Completed [============================================================================>-------------------------]  75% with 0 failures
 Completed [============================================================================>-------------------------]  76% with 0 failures
 Completed [=============================================================================>------------------------]  76% with 0 failures
 Completed [=============================================================================>------------------------]  77% with 0 failures
 Completed [==============================================================================>-----------------------]  77% with 0 failures
 Completed [==============================================================================>-----------------------]  78% with 0 failures
 Completed [===============================================================================>----------------------]  78% with 0 failures
 Completed [===============================================================================>----------------------]  79% with 0 failures
 Completed [================================================================================>---------------------]  79% with 0 failures
 Completed [================================================================================>---------------------]  80% with 0 failures
 Completed [=================================================================================>--------------------]  80% with 0 failures
 Completed [=================================================================================>--------------------]  81% with 0 failures
 Completed [==================================================================================>-------------------]  81% with 0 failures
 Completed [==================================================================================>-------------------]  82% with 0 failures
 Completed [===================================================================================>------------------]  82% with 0 failures
 Completed [===================================================================================>------------------]  83% with 0 failures
 Completed [====================================================================================>-----------------]  83% with 0 failures
 Completed [====================================================================================>-----------------]  84% with 0 failures
 Completed [=====================================================================================>----------------]  84% with 0 failures
 Completed [=====================================================================================>----------------]  85% with 0 failures
 Completed [======================================================================================>---------------]  85% with 0 failures
 Completed [======================================================================================>---------------]  86% with 0 failures
 Completed [=======================================================================================>--------------]  86% with 0 failures
 Completed [=======================================================================================>--------------]  87% with 0 failures
 Completed [========================================================================================>-------------]  87% with 0 failures
 Completed [========================================================================================>-------------]  88% with 0 failures
 Completed [=========================================================================================>------------]  88% with 0 failures
 Completed [=========================================================================================>------------]  89% with 0 failures
 Completed [==========================================================================================>-----------]  89% with 0 failures
 Completed [==========================================================================================>-----------]  90% with 0 failures
 Completed [===========================================================================================>----------]  90% with 0 failures
 Completed [===========================================================================================>----------]  91% with 0 failures
 Completed [============================================================================================>---------]  91% with 0 failures
 Completed [============================================================================================>---------]  92% with 0 failures
 Completed [=============================================================================================>--------]  92% with 0 failures
 Completed [=============================================================================================>--------]  93% with 0 failures
 Completed [==============================================================================================>-------]  93% with 0 failures
 Completed [==============================================================================================>-------]  94% with 0 failures
 Completed [===============================================================================================>------]  94% with 0 failures
 Completed [===============================================================================================>------]  95% with 0 failures
 Completed [================================================================================================>-----]  95% with 0 failures
 Completed [================================================================================================>-----]  96% with 0 failures
 Completed [=================================================================================================>----]  96% with 0 failures
 Completed [=================================================================================================>----]  97% with 0 failures
 Completed [==================================================================================================>---]  97% with 0 failures
 Completed [==================================================================================================>---]  98% with 0 failures
 Completed [===================================================================================================>--]  98% with 0 failures
 Completed [====================================================================================================>-]  99% with 0 failures
 Completed [=====================================================================================================>] 100% with 0 failures
 Completed [======================================================================================================] 100% with 0 failures
                                                                                                                                        

Done!
Combining coefficients and standard errors
Calculating log-fold changes
Calculating likelihood ratio tests
Refitting on reduced model...

 Completed [=>----------------------------------------------------------------------------------------------------]   2% with 0 failures
 Completed [==>---------------------------------------------------------------------------------------------------]   2% with 0 failures
 Completed [==>---------------------------------------------------------------------------------------------------]   3% with 0 failures
 Completed [===>--------------------------------------------------------------------------------------------------]   3% with 0 failures
 Completed [===>--------------------------------------------------------------------------------------------------]   4% with 0 failures
 Completed [====>-------------------------------------------------------------------------------------------------]   4% with 0 failures
 Completed [====>-------------------------------------------------------------------------------------------------]   5% with 0 failures
 Completed [=====>------------------------------------------------------------------------------------------------]   5% with 0 failures
 Completed [=====>------------------------------------------------------------------------------------------------]   6% with 0 failures
 Completed [======>-----------------------------------------------------------------------------------------------]   6% with 0 failures
 Completed [======>-----------------------------------------------------------------------------------------------]   7% with 0 failures
 Completed [=======>----------------------------------------------------------------------------------------------]   7% with 0 failures
 Completed [=======>----------------------------------------------------------------------------------------------]   8% with 0 failures
 Completed [========>---------------------------------------------------------------------------------------------]   8% with 0 failures
 Completed [========>---------------------------------------------------------------------------------------------]   9% with 0 failures
 Completed [=========>--------------------------------------------------------------------------------------------]   9% with 0 failures
 Completed [=========>--------------------------------------------------------------------------------------------]  10% with 0 failures
 Completed [==========>-------------------------------------------------------------------------------------------]  10% with 0 failures
 Completed [==========>-------------------------------------------------------------------------------------------]  11% with 0 failures
 Completed [===========>------------------------------------------------------------------------------------------]  11% with 0 failures
 Completed [===========>------------------------------------------------------------------------------------------]  12% with 0 failures
 Completed [============>-----------------------------------------------------------------------------------------]  12% with 0 failures
 Completed [============>-----------------------------------------------------------------------------------------]  13% with 0 failures
 Completed [=============>----------------------------------------------------------------------------------------]  13% with 0 failures
 Completed [=============>----------------------------------------------------------------------------------------]  14% with 0 failures
 Completed [==============>---------------------------------------------------------------------------------------]  14% with 0 failures
 Completed [==============>---------------------------------------------------------------------------------------]  15% with 0 failures
 Completed [===============>--------------------------------------------------------------------------------------]  15% with 0 failures
 Completed [===============>--------------------------------------------------------------------------------------]  16% with 0 failures
 Completed [================>-------------------------------------------------------------------------------------]  16% with 0 failures
 Completed [================>-------------------------------------------------------------------------------------]  17% with 0 failures
 Completed [=================>------------------------------------------------------------------------------------]  17% with 0 failures
 Completed [=================>------------------------------------------------------------------------------------]  18% with 0 failures
 Completed [==================>-----------------------------------------------------------------------------------]  18% with 0 failures
 Completed [==================>-----------------------------------------------------------------------------------]  19% with 0 failures
 Completed [===================>----------------------------------------------------------------------------------]  19% with 0 failures
 Completed [===================>----------------------------------------------------------------------------------]  20% with 0 failures
 Completed [====================>---------------------------------------------------------------------------------]  20% with 0 failures
 Completed [====================>---------------------------------------------------------------------------------]  21% with 0 failures
 Completed [=====================>--------------------------------------------------------------------------------]  21% with 0 failures
 Completed [=====================>--------------------------------------------------------------------------------]  22% with 0 failures
 Completed [======================>-------------------------------------------------------------------------------]  22% with 0 failures
 Completed [======================>-------------------------------------------------------------------------------]  23% with 0 failures
 Completed [=======================>------------------------------------------------------------------------------]  23% with 0 failures
 Completed [=======================>------------------------------------------------------------------------------]  24% with 0 failures
 Completed [========================>-----------------------------------------------------------------------------]  24% with 0 failures
 Completed [========================>-----------------------------------------------------------------------------]  25% with 0 failures
 Completed [=========================>----------------------------------------------------------------------------]  25% with 0 failures
 Completed [=========================>----------------------------------------------------------------------------]  26% with 0 failures
 Completed [==========================>---------------------------------------------------------------------------]  26% with 0 failures
 Completed [==========================>---------------------------------------------------------------------------]  27% with 0 failures
 Completed [===========================>--------------------------------------------------------------------------]  27% with 0 failures
 Completed [===========================>--------------------------------------------------------------------------]  28% with 0 failures
 Completed [============================>-------------------------------------------------------------------------]  28% with 0 failures
 Completed [============================>-------------------------------------------------------------------------]  29% with 0 failures
 Completed [=============================>------------------------------------------------------------------------]  29% with 0 failures
 Completed [=============================>------------------------------------------------------------------------]  30% with 0 failures
 Completed [==============================>-----------------------------------------------------------------------]  30% with 0 failures
 Completed [==============================>-----------------------------------------------------------------------]  31% with 0 failures
 Completed [===============================>----------------------------------------------------------------------]  31% with 0 failures
 Completed [===============================>----------------------------------------------------------------------]  32% with 0 failures
 Completed [================================>---------------------------------------------------------------------]  32% with 0 failures
 Completed [================================>---------------------------------------------------------------------]  33% with 0 failures
 Completed [=================================>--------------------------------------------------------------------]  33% with 0 failures
 Completed [=================================>--------------------------------------------------------------------]  34% with 0 failures
 Completed [==================================>-------------------------------------------------------------------]  34% with 0 failures
 Completed [==================================>-------------------------------------------------------------------]  35% with 0 failures
 Completed [===================================>------------------------------------------------------------------]  35% with 0 failures
 Completed [===================================>------------------------------------------------------------------]  36% with 0 failures
 Completed [====================================>-----------------------------------------------------------------]  36% with 0 failures
 Completed [====================================>-----------------------------------------------------------------]  37% with 0 failures
 Completed [=====================================>----------------------------------------------------------------]  37% with 0 failures
 Completed [=====================================>----------------------------------------------------------------]  38% with 0 failures
 Completed [======================================>---------------------------------------------------------------]  38% with 0 failures
 Completed [======================================>---------------------------------------------------------------]  39% with 0 failures
 Completed [=======================================>--------------------------------------------------------------]  39% with 0 failures
 Completed [=======================================>--------------------------------------------------------------]  40% with 0 failures
 Completed [========================================>-------------------------------------------------------------]  40% with 0 failures
 Completed [========================================>-------------------------------------------------------------]  41% with 0 failures
 Completed [=========================================>------------------------------------------------------------]  41% with 0 failures
 Completed [=========================================>------------------------------------------------------------]  42% with 0 failures
 Completed [==========================================>-----------------------------------------------------------]  42% with 0 failures
 Completed [==========================================>-----------------------------------------------------------]  43% with 0 failures
 Completed [===========================================>----------------------------------------------------------]  43% with 0 failures
 Completed [===========================================>----------------------------------------------------------]  44% with 0 failures
 Completed [============================================>---------------------------------------------------------]  44% with 0 failures
 Completed [============================================>---------------------------------------------------------]  45% with 0 failures
 Completed [=============================================>--------------------------------------------------------]  45% with 0 failures
 Completed [=============================================>--------------------------------------------------------]  46% with 0 failures
 Completed [==============================================>-------------------------------------------------------]  46% with 0 failures
 Completed [==============================================>-------------------------------------------------------]  47% with 0 failures
 Completed [===============================================>------------------------------------------------------]  47% with 0 failures
 Completed [===============================================>------------------------------------------------------]  48% with 0 failures
 Completed [================================================>-----------------------------------------------------]  48% with 0 failures
 Completed [=================================================>----------------------------------------------------]  49% with 0 failures
 Completed [==================================================>---------------------------------------------------]  50% with 0 failures
 Completed [===================================================>--------------------------------------------------]  51% with 0 failures
 Completed [====================================================>-------------------------------------------------]  52% with 0 failures
 Completed [=====================================================>------------------------------------------------]  52% with 0 failures
 Completed [=====================================================>------------------------------------------------]  53% with 0 failures
 Completed [======================================================>-----------------------------------------------]  53% with 0 failures
 Completed [======================================================>-----------------------------------------------]  54% with 0 failures
 Completed [=======================================================>----------------------------------------------]  54% with 0 failures
 Completed [=======================================================>----------------------------------------------]  55% with 0 failures
 Completed [========================================================>---------------------------------------------]  55% with 0 failures
 Completed [========================================================>---------------------------------------------]  56% with 0 failures
 Completed [=========================================================>--------------------------------------------]  56% with 0 failures
 Completed [=========================================================>--------------------------------------------]  57% with 0 failures
 Completed [==========================================================>-------------------------------------------]  57% with 0 failures
 Completed [==========================================================>-------------------------------------------]  58% with 0 failures
 Completed [===========================================================>------------------------------------------]  58% with 0 failures
 Completed [===========================================================>------------------------------------------]  59% with 0 failures
 Completed [============================================================>-----------------------------------------]  59% with 0 failures
 Completed [============================================================>-----------------------------------------]  60% with 0 failures
 Completed [=============================================================>----------------------------------------]  60% with 0 failures
 Completed [=============================================================>----------------------------------------]  61% with 0 failures
 Completed [==============================================================>---------------------------------------]  61% with 0 failures
 Completed [==============================================================>---------------------------------------]  62% with 0 failures
 Completed [===============================================================>--------------------------------------]  62% with 0 failures
 Completed [===============================================================>--------------------------------------]  63% with 0 failures
 Completed [================================================================>-------------------------------------]  63% with 0 failures
 Completed [================================================================>-------------------------------------]  64% with 0 failures
 Completed [=================================================================>------------------------------------]  64% with 0 failures
 Completed [=================================================================>------------------------------------]  65% with 0 failures
 Completed [==================================================================>-----------------------------------]  65% with 0 failures
 Completed [==================================================================>-----------------------------------]  66% with 0 failures
 Completed [===================================================================>----------------------------------]  66% with 0 failures
 Completed [===================================================================>----------------------------------]  67% with 0 failures
 Completed [====================================================================>---------------------------------]  67% with 0 failures
 Completed [====================================================================>---------------------------------]  68% with 0 failures
 Completed [=====================================================================>--------------------------------]  68% with 0 failures
 Completed [=====================================================================>--------------------------------]  69% with 0 failures
 Completed [======================================================================>-------------------------------]  69% with 0 failures
 Completed [======================================================================>-------------------------------]  70% with 0 failures
 Completed [=======================================================================>------------------------------]  70% with 0 failures
 Completed [=======================================================================>------------------------------]  71% with 0 failures
 Completed [========================================================================>-----------------------------]  71% with 0 failures
 Completed [========================================================================>-----------------------------]  72% with 0 failures
 Completed [=========================================================================>----------------------------]  72% with 0 failures
 Completed [=========================================================================>----------------------------]  73% with 0 failures
 Completed [==========================================================================>---------------------------]  73% with 0 failures
 Completed [==========================================================================>---------------------------]  74% with 0 failures
 Completed [===========================================================================>--------------------------]  74% with 0 failures
 Completed [===========================================================================>--------------------------]  75% with 0 failures
 Completed [============================================================================>-------------------------]  75% with 0 failures
 Completed [============================================================================>-------------------------]  76% with 0 failures
 Completed [=============================================================================>------------------------]  76% with 0 failures
 Completed [=============================================================================>------------------------]  77% with 0 failures
 Completed [==============================================================================>-----------------------]  77% with 0 failures
 Completed [==============================================================================>-----------------------]  78% with 0 failures
 Completed [===============================================================================>----------------------]  78% with 0 failures
 Completed [===============================================================================>----------------------]  79% with 0 failures
 Completed [================================================================================>---------------------]  79% with 0 failures
 Completed [================================================================================>---------------------]  80% with 0 failures
 Completed [=================================================================================>--------------------]  80% with 0 failures
 Completed [=================================================================================>--------------------]  81% with 0 failures
 Completed [==================================================================================>-------------------]  81% with 0 failures
 Completed [==================================================================================>-------------------]  82% with 0 failures
 Completed [===================================================================================>------------------]  82% with 0 failures
 Completed [===================================================================================>------------------]  83% with 0 failures
 Completed [====================================================================================>-----------------]  83% with 0 failures
 Completed [====================================================================================>-----------------]  84% with 0 failures
 Completed [=====================================================================================>----------------]  84% with 0 failures
 Completed [=====================================================================================>----------------]  85% with 0 failures
 Completed [======================================================================================>---------------]  85% with 0 failures
 Completed [======================================================================================>---------------]  86% with 0 failures
 Completed [=======================================================================================>--------------]  86% with 0 failures
 Completed [=======================================================================================>--------------]  87% with 0 failures
 Completed [========================================================================================>-------------]  87% with 0 failures
 Completed [========================================================================================>-------------]  88% with 0 failures
 Completed [=========================================================================================>------------]  88% with 0 failures
 Completed [=========================================================================================>------------]  89% with 0 failures
 Completed [==========================================================================================>-----------]  89% with 0 failures
 Completed [==========================================================================================>-----------]  90% with 0 failures
 Completed [===========================================================================================>----------]  90% with 0 failures
 Completed [===========================================================================================>----------]  91% with 0 failures
 Completed [============================================================================================>---------]  91% with 0 failures
 Completed [============================================================================================>---------]  92% with 0 failures
 Completed [=============================================================================================>--------]  92% with 0 failures
 Completed [=============================================================================================>--------]  93% with 0 failures
 Completed [==============================================================================================>-------]  93% with 0 failures
 Completed [==============================================================================================>-------]  94% with 0 failures
 Completed [===============================================================================================>------]  94% with 0 failures
 Completed [===============================================================================================>------]  95% with 0 failures
 Completed [================================================================================================>-----]  95% with 0 failures
 Completed [================================================================================================>-----]  96% with 0 failures
 Completed [=================================================================================================>----]  96% with 0 failures
 Completed [=================================================================================================>----]  97% with 0 failures
 Completed [==================================================================================================>---]  97% with 0 failures
 Completed [==================================================================================================>---]  98% with 0 failures
 Completed [===================================================================================================>--]  98% with 0 failures
 Completed [====================================================================================================>-]  99% with 0 failures
 Completed [=====================================================================================================>] 100% with 0 failures
 Completed [======================================================================================================] 100% with 0 failures
                                                                                                                                        

Done!
md3_markers <- md3_markers[md3_markers$p_val_adj < 0.05, ]
head(md3_markers, n = 15)
md3_markers_annotated <- merge(gene_annotations, md3_markers, by.x = "Gene.ID", by.y = "0")
Error in fix.by(by.y, y) : 'by' must specify a uniquely valid column
VlnPlot(cells.4, features = c("PBANKA-1030100", "PBANKA-1206900"), group.by = "identity_combined", pt.size = 0, combine = FALSE, slot = "data", assay = "RNA")
[[1]]

[[2]]

cells_to_plot <- rownames(tenx.mutant.integrated.sex@meta.data[tenx.mutant.integrated.sex@meta.data$identity_combined == c("wild-type (10x)", "wild-type (Smart-seq2)", "md3"), ])
FeaturePlot(tenx.mutant.integrated.sex, features = c("PBANKA-1030100", "PBANKA-1206900"), dims = c(1,2), reduction = "DIM_PCA", cells = cells_to_plot, split.by = "genotype_combined")

Some issues with actin 2 and beta tubulin which may prevent a fully fertile gametocyte

md4

cells.12 <- subset(tenx.mutant.integrated.sex, idents = "12")
DefaultAssay(cells.12) <- "RNA"
Idents(cells.12) <- "identity_combined"
md4_markers <- FindMarkers(cells.12, ident.1 = "md4", ident.2 = c("wild-type (10x)", "wild-type (Smart-seq2)"), test.use = "MAST", verbose = FALSE)
Assuming data assay in position 1, with name et is log-transformed.

 Completed [>-----------------------------------------------------------------------]   1% with 0 failures
 Completed [>-----------------------------------------------------------------------]   2% with 0 failures
 Completed [=>----------------------------------------------------------------------]   2% with 0 failures
 Completed [=>----------------------------------------------------------------------]   3% with 0 failures
 Completed [==>---------------------------------------------------------------------]   3% with 0 failures
 Completed [==>---------------------------------------------------------------------]   4% with 0 failures
 Completed [==>---------------------------------------------------------------------]   5% with 0 failures
 Completed [===>--------------------------------------------------------------------]   5% with 0 failures
 Completed [===>--------------------------------------------------------------------]   6% with 0 failures
 Completed [====>-------------------------------------------------------------------]   6% with 0 failures
 Completed [====>-------------------------------------------------------------------]   7% with 0 failures
 Completed [====>-------------------------------------------------------------------]   8% with 0 failures
 Completed [=====>------------------------------------------------------------------]   8% with 0 failures
 Completed [=====>------------------------------------------------------------------]   9% with 0 failures
 Completed [======>-----------------------------------------------------------------]   9% with 0 failures
 Completed [======>-----------------------------------------------------------------]  10% with 0 failures
 Completed [=======>----------------------------------------------------------------]  10% with 0 failures
 Completed [=======>----------------------------------------------------------------]  11% with 0 failures
 Completed [=======>----------------------------------------------------------------]  12% with 0 failures
 Completed [========>---------------------------------------------------------------]  12% with 0 failures
 Completed [========>---------------------------------------------------------------]  13% with 0 failures
 Completed [=========>--------------------------------------------------------------]  13% with 0 failures
 Completed [=========>--------------------------------------------------------------]  14% with 0 failures
 Completed [=========>--------------------------------------------------------------]  15% with 0 failures
 Completed [==========>-------------------------------------------------------------]  15% with 0 failures
 Completed [==========>-------------------------------------------------------------]  16% with 0 failures
 Completed [===========>------------------------------------------------------------]  16% with 0 failures
 Completed [===========>------------------------------------------------------------]  17% with 0 failures
 Completed [============>-----------------------------------------------------------]  17% with 0 failures
 Completed [============>-----------------------------------------------------------]  18% with 0 failures
 Completed [============>-----------------------------------------------------------]  19% with 0 failures
 Completed [=============>----------------------------------------------------------]  19% with 0 failures
 Completed [=============>----------------------------------------------------------]  20% with 0 failures
 Completed [==============>---------------------------------------------------------]  20% with 0 failures
 Completed [==============>---------------------------------------------------------]  21% with 0 failures
 Completed [==============>---------------------------------------------------------]  22% with 0 failures
 Completed [===============>--------------------------------------------------------]  22% with 0 failures
 Completed [===============>--------------------------------------------------------]  23% with 0 failures
 Completed [================>-------------------------------------------------------]  23% with 0 failures
 Completed [================>-------------------------------------------------------]  24% with 0 failures
 Completed [=================>------------------------------------------------------]  24% with 0 failures
 Completed [=================>------------------------------------------------------]  25% with 0 failures
 Completed [=================>------------------------------------------------------]  26% with 0 failures
 Completed [==================>-----------------------------------------------------]  26% with 0 failures
 Completed [==================>-----------------------------------------------------]  27% with 0 failures
 Completed [===================>----------------------------------------------------]  27% with 0 failures
 Completed [===================>----------------------------------------------------]  28% with 0 failures
 Completed [====================>---------------------------------------------------]  28% with 0 failures
 Completed [====================>---------------------------------------------------]  29% with 0 failures
 Completed [====================>---------------------------------------------------]  30% with 0 failures
 Completed [=====================>--------------------------------------------------]  30% with 0 failures
 Completed [=====================>--------------------------------------------------]  31% with 0 failures
 Completed [======================>-------------------------------------------------]  31% with 0 failures
 Completed [======================>-------------------------------------------------]  32% with 0 failures
 Completed [======================>-------------------------------------------------]  33% with 0 failures
 Completed [=======================>------------------------------------------------]  33% with 0 failures
 Completed [=======================>------------------------------------------------]  34% with 0 failures
 Completed [========================>-----------------------------------------------]  34% with 0 failures
 Completed [========================>-----------------------------------------------]  35% with 0 failures
 Completed [=========================>----------------------------------------------]  35% with 0 failures
 Completed [=========================>----------------------------------------------]  36% with 0 failures
 Completed [=========================>----------------------------------------------]  37% with 0 failures
 Completed [==========================>---------------------------------------------]  37% with 0 failures
 Completed [==========================>---------------------------------------------]  38% with 0 failures
 Completed [===========================>--------------------------------------------]  38% with 0 failures
 Completed [===========================>--------------------------------------------]  39% with 0 failures
 Completed [===========================>--------------------------------------------]  40% with 0 failures
 Completed [============================>-------------------------------------------]  40% with 0 failures
 Completed [============================>-------------------------------------------]  41% with 0 failures
 Completed [=============================>------------------------------------------]  41% with 0 failures
 Completed [=============================>------------------------------------------]  42% with 0 failures
 Completed [==============================>-----------------------------------------]  42% with 0 failures
 Completed [==============================>-----------------------------------------]  43% with 0 failures
 Completed [==============================>-----------------------------------------]  44% with 0 failures
 Completed [===============================>----------------------------------------]  44% with 0 failures
 Completed [===============================>----------------------------------------]  45% with 0 failures
 Completed [================================>---------------------------------------]  45% with 0 failures
 Completed [================================>---------------------------------------]  46% with 0 failures
 Completed [================================>---------------------------------------]  47% with 0 failures
 Completed [=================================>--------------------------------------]  47% with 0 failures
 Completed [=================================>--------------------------------------]  48% with 0 failures
 Completed [==================================>-------------------------------------]  48% with 0 failures
 Completed [==================================>-------------------------------------]  49% with 0 failures
 Completed [===================================>------------------------------------]  49% with 0 failures
 Completed [===================================>------------------------------------]  50% with 0 failures
 Completed [===================================>------------------------------------]  51% with 0 failures
 Completed [====================================>-----------------------------------]  51% with 0 failures
 Completed [====================================>-----------------------------------]  52% with 0 failures
 Completed [=====================================>----------------------------------]  52% with 0 failures
 Completed [=====================================>----------------------------------]  53% with 0 failures
 Completed [======================================>---------------------------------]  53% with 0 failures
 Completed [======================================>---------------------------------]  54% with 0 failures
 Completed [======================================>---------------------------------]  55% with 0 failures
 Completed [=======================================>--------------------------------]  55% with 0 failures
 Completed [=======================================>--------------------------------]  56% with 0 failures
 Completed [========================================>-------------------------------]  56% with 0 failures
 Completed [========================================>-------------------------------]  57% with 0 failures
 Completed [========================================>-------------------------------]  58% with 0 failures
 Completed [=========================================>------------------------------]  58% with 0 failures
 Completed [=========================================>------------------------------]  59% with 0 failures
 Completed [==========================================>-----------------------------]  59% with 0 failures
 Completed [==========================================>-----------------------------]  60% with 0 failures
 Completed [===========================================>----------------------------]  60% with 0 failures
 Completed [===========================================>----------------------------]  61% with 0 failures
 Completed [===========================================>----------------------------]  62% with 0 failures
 Completed [============================================>---------------------------]  62% with 0 failures
 Completed [============================================>---------------------------]  63% with 0 failures
 Completed [=============================================>--------------------------]  63% with 0 failures
 Completed [=============================================>--------------------------]  64% with 0 failures
 Completed [=============================================>--------------------------]  65% with 0 failures
 Completed [==============================================>-------------------------]  65% with 0 failures
 Completed [==============================================>-------------------------]  66% with 0 failures
 Completed [===============================================>------------------------]  66% with 0 failures
 Completed [===============================================>------------------------]  67% with 0 failures
 Completed [================================================>-----------------------]  67% with 0 failures
 Completed [================================================>-----------------------]  68% with 0 failures
 Completed [================================================>-----------------------]  69% with 0 failures
 Completed [=================================================>----------------------]  69% with 0 failures
 Completed [=================================================>----------------------]  70% with 0 failures
 Completed [==================================================>---------------------]  70% with 0 failures
 Completed [==================================================>---------------------]  71% with 0 failures
 Completed [==================================================>---------------------]  72% with 0 failures
 Completed [===================================================>--------------------]  72% with 0 failures
 Completed [===================================================>--------------------]  73% with 0 failures
 Completed [====================================================>-------------------]  73% with 0 failures
 Completed [====================================================>-------------------]  74% with 0 failures
 Completed [=====================================================>------------------]  74% with 0 failures
 Completed [=====================================================>------------------]  75% with 0 failures
 Completed [=====================================================>------------------]  76% with 0 failures
 Completed [======================================================>-----------------]  76% with 0 failures
 Completed [======================================================>-----------------]  77% with 0 failures
 Completed [=======================================================>----------------]  77% with 0 failures
 Completed [=======================================================>----------------]  78% with 0 failures
 Completed [========================================================>---------------]  78% with 0 failures
 Completed [========================================================>---------------]  79% with 0 failures
 Completed [========================================================>---------------]  80% with 0 failures
 Completed [=========================================================>--------------]  80% with 0 failures
 Completed [=========================================================>--------------]  81% with 0 failures
 Completed [==========================================================>-------------]  81% with 0 failures
 Completed [==========================================================>-------------]  82% with 0 failures
 Completed [==========================================================>-------------]  83% with 0 failures
 Completed [===========================================================>------------]  83% with 0 failures
 Completed [===========================================================>------------]  84% with 0 failures
 Completed [============================================================>-----------]  84% with 0 failures
 Completed [============================================================>-----------]  85% with 0 failures
 Completed [=============================================================>----------]  85% with 0 failures
 Completed [=============================================================>----------]  86% with 0 failures
 Completed [=============================================================>----------]  87% with 0 failures
 Completed [==============================================================>---------]  87% with 0 failures
 Completed [==============================================================>---------]  88% with 0 failures
 Completed [===============================================================>--------]  88% with 0 failures
 Completed [===============================================================>--------]  89% with 0 failures
 Completed [===============================================================>--------]  90% with 0 failures
 Completed [================================================================>-------]  90% with 0 failures
 Completed [================================================================>-------]  91% with 0 failures
 Completed [=================================================================>------]  91% with 0 failures
 Completed [=================================================================>------]  92% with 0 failures
 Completed [==================================================================>-----]  92% with 0 failures
 Completed [==================================================================>-----]  93% with 0 failures
 Completed [==================================================================>-----]  94% with 0 failures
 Completed [===================================================================>----]  94% with 0 failures
 Completed [===================================================================>----]  95% with 0 failures
 Completed [====================================================================>---]  95% with 0 failures
 Completed [====================================================================>---]  96% with 0 failures
 Completed [====================================================================>---]  97% with 0 failures
 Completed [=====================================================================>--]  97% with 0 failures
 Completed [=====================================================================>--]  98% with 0 failures
 Completed [======================================================================>-]  98% with 0 failures
 Completed [======================================================================>-]  99% with 0 failures
 Completed [=======================================================================>]  99% with 0 failures
 Completed [=======================================================================>] 100% with 0 failures
 Completed [========================================================================] 100% with 0 failures
                                                                                                          

Done!
Combining coefficients and standard errors
Calculating log-fold changes
Calculating likelihood ratio tests
Refitting on reduced model...

 Completed [=>----------------------------------------------------------------------]   2% with 0 failures
 Completed [=>----------------------------------------------------------------------]   3% with 0 failures
 Completed [==>---------------------------------------------------------------------]   3% with 0 failures
 Completed [==>---------------------------------------------------------------------]   4% with 0 failures
 Completed [==>---------------------------------------------------------------------]   5% with 0 failures
 Completed [===>--------------------------------------------------------------------]   5% with 0 failures
 Completed [===>--------------------------------------------------------------------]   6% with 0 failures
 Completed [====>-------------------------------------------------------------------]   6% with 0 failures
 Completed [====>-------------------------------------------------------------------]   7% with 0 failures
 Completed [====>-------------------------------------------------------------------]   8% with 0 failures
 Completed [=====>------------------------------------------------------------------]   8% with 0 failures
 Completed [=====>------------------------------------------------------------------]   9% with 0 failures
 Completed [======>-----------------------------------------------------------------]   9% with 0 failures
 Completed [======>-----------------------------------------------------------------]  10% with 0 failures
 Completed [=======>----------------------------------------------------------------]  10% with 0 failures
 Completed [=======>----------------------------------------------------------------]  11% with 0 failures
 Completed [=======>----------------------------------------------------------------]  12% with 0 failures
 Completed [========>---------------------------------------------------------------]  12% with 0 failures
 Completed [========>---------------------------------------------------------------]  13% with 0 failures
 Completed [=========>--------------------------------------------------------------]  13% with 0 failures
 Completed [=========>--------------------------------------------------------------]  14% with 0 failures
 Completed [=========>--------------------------------------------------------------]  15% with 0 failures
 Completed [==========>-------------------------------------------------------------]  15% with 0 failures
 Completed [==========>-------------------------------------------------------------]  16% with 0 failures
 Completed [===========>------------------------------------------------------------]  16% with 0 failures
 Completed [===========>------------------------------------------------------------]  17% with 0 failures
 Completed [============>-----------------------------------------------------------]  17% with 0 failures
 Completed [============>-----------------------------------------------------------]  18% with 0 failures
 Completed [============>-----------------------------------------------------------]  19% with 0 failures
 Completed [=============>----------------------------------------------------------]  19% with 0 failures
 Completed [=============>----------------------------------------------------------]  20% with 0 failures
 Completed [==============>---------------------------------------------------------]  20% with 0 failures
 Completed [==============>---------------------------------------------------------]  21% with 0 failures
 Completed [==============>---------------------------------------------------------]  22% with 0 failures
 Completed [===============>--------------------------------------------------------]  22% with 0 failures
 Completed [===============>--------------------------------------------------------]  23% with 0 failures
 Completed [================>-------------------------------------------------------]  23% with 0 failures
 Completed [================>-------------------------------------------------------]  24% with 0 failures
 Completed [=================>------------------------------------------------------]  24% with 0 failures
 Completed [=================>------------------------------------------------------]  25% with 0 failures
 Completed [=================>------------------------------------------------------]  26% with 0 failures
 Completed [==================>-----------------------------------------------------]  26% with 0 failures
 Completed [==================>-----------------------------------------------------]  27% with 0 failures
 Completed [===================>----------------------------------------------------]  27% with 0 failures
 Completed [===================>----------------------------------------------------]  28% with 0 failures
 Completed [====================>---------------------------------------------------]  28% with 0 failures
 Completed [====================>---------------------------------------------------]  29% with 0 failures
 Completed [====================>---------------------------------------------------]  30% with 0 failures
 Completed [=====================>--------------------------------------------------]  30% with 0 failures
 Completed [=====================>--------------------------------------------------]  31% with 0 failures
 Completed [======================>-------------------------------------------------]  31% with 0 failures
 Completed [======================>-------------------------------------------------]  32% with 0 failures
 Completed [======================>-------------------------------------------------]  33% with 0 failures
 Completed [=======================>------------------------------------------------]  33% with 0 failures
 Completed [=======================>------------------------------------------------]  34% with 0 failures
 Completed [========================>-----------------------------------------------]  34% with 0 failures
 Completed [========================>-----------------------------------------------]  35% with 0 failures
 Completed [=========================>----------------------------------------------]  35% with 0 failures
 Completed [=========================>----------------------------------------------]  36% with 0 failures
 Completed [=========================>----------------------------------------------]  37% with 0 failures
 Completed [==========================>---------------------------------------------]  37% with 0 failures
 Completed [==========================>---------------------------------------------]  38% with 0 failures
 Completed [===========================>--------------------------------------------]  38% with 0 failures
 Completed [===========================>--------------------------------------------]  39% with 0 failures
 Completed [===========================>--------------------------------------------]  40% with 0 failures
 Completed [============================>-------------------------------------------]  40% with 0 failures
 Completed [============================>-------------------------------------------]  41% with 0 failures
 Completed [=============================>------------------------------------------]  41% with 0 failures
 Completed [=============================>------------------------------------------]  42% with 0 failures
 Completed [==============================>-----------------------------------------]  42% with 0 failures
 Completed [==============================>-----------------------------------------]  43% with 0 failures
 Completed [==============================>-----------------------------------------]  44% with 0 failures
 Completed [===============================>----------------------------------------]  44% with 0 failures
 Completed [===============================>----------------------------------------]  45% with 0 failures
 Completed [================================>---------------------------------------]  45% with 0 failures
 Completed [================================>---------------------------------------]  46% with 0 failures
 Completed [================================>---------------------------------------]  47% with 0 failures
 Completed [=================================>--------------------------------------]  47% with 0 failures
 Completed [=================================>--------------------------------------]  48% with 0 failures
 Completed [==================================>-------------------------------------]  48% with 0 failures
 Completed [==================================>-------------------------------------]  49% with 0 failures
 Completed [===================================>------------------------------------]  49% with 0 failures
 Completed [===================================>------------------------------------]  50% with 0 failures
 Completed [===================================>------------------------------------]  51% with 0 failures
 Completed [====================================>-----------------------------------]  51% with 0 failures
 Completed [====================================>-----------------------------------]  52% with 0 failures
 Completed [=====================================>----------------------------------]  52% with 0 failures
 Completed [=====================================>----------------------------------]  53% with 0 failures
 Completed [======================================>---------------------------------]  53% with 0 failures
 Completed [======================================>---------------------------------]  54% with 0 failures
 Completed [======================================>---------------------------------]  55% with 0 failures
 Completed [=======================================>--------------------------------]  55% with 0 failures
 Completed [=======================================>--------------------------------]  56% with 0 failures
 Completed [========================================>-------------------------------]  56% with 0 failures
 Completed [========================================>-------------------------------]  57% with 0 failures
 Completed [========================================>-------------------------------]  58% with 0 failures
 Completed [=========================================>------------------------------]  58% with 0 failures
 Completed [=========================================>------------------------------]  59% with 0 failures
 Completed [==========================================>-----------------------------]  59% with 0 failures
 Completed [==========================================>-----------------------------]  60% with 0 failures
 Completed [===========================================>----------------------------]  60% with 0 failures
 Completed [===========================================>----------------------------]  61% with 0 failures
 Completed [===========================================>----------------------------]  62% with 0 failures
 Completed [============================================>---------------------------]  62% with 0 failures
 Completed [============================================>---------------------------]  63% with 0 failures
 Completed [=============================================>--------------------------]  63% with 0 failures
 Completed [=============================================>--------------------------]  64% with 0 failures
 Completed [=============================================>--------------------------]  65% with 0 failures
 Completed [==============================================>-------------------------]  65% with 0 failures
 Completed [==============================================>-------------------------]  66% with 0 failures
 Completed [===============================================>------------------------]  66% with 0 failures
 Completed [===============================================>------------------------]  67% with 0 failures
 Completed [================================================>-----------------------]  67% with 0 failures
 Completed [================================================>-----------------------]  68% with 0 failures
 Completed [================================================>-----------------------]  69% with 0 failures
 Completed [=================================================>----------------------]  69% with 0 failures
 Completed [=================================================>----------------------]  70% with 0 failures
 Completed [==================================================>---------------------]  70% with 0 failures
 Completed [==================================================>---------------------]  71% with 0 failures
 Completed [==================================================>---------------------]  72% with 0 failures
 Completed [===================================================>--------------------]  72% with 0 failures
 Completed [===================================================>--------------------]  73% with 0 failures
 Completed [====================================================>-------------------]  73% with 0 failures
 Completed [====================================================>-------------------]  74% with 0 failures
 Completed [=====================================================>------------------]  74% with 0 failures
 Completed [=====================================================>------------------]  75% with 0 failures
 Completed [=====================================================>------------------]  76% with 0 failures
 Completed [======================================================>-----------------]  76% with 0 failures
 Completed [======================================================>-----------------]  77% with 0 failures
 Completed [=======================================================>----------------]  77% with 0 failures
 Completed [=======================================================>----------------]  78% with 0 failures
 Completed [========================================================>---------------]  78% with 0 failures
 Completed [========================================================>---------------]  79% with 0 failures
 Completed [========================================================>---------------]  80% with 0 failures
 Completed [=========================================================>--------------]  80% with 0 failures
 Completed [=========================================================>--------------]  81% with 0 failures
 Completed [==========================================================>-------------]  81% with 0 failures
 Completed [==========================================================>-------------]  82% with 0 failures
 Completed [==========================================================>-------------]  83% with 0 failures
 Completed [===========================================================>------------]  83% with 0 failures
 Completed [===========================================================>------------]  84% with 0 failures
 Completed [============================================================>-----------]  84% with 0 failures
 Completed [============================================================>-----------]  85% with 0 failures
 Completed [=============================================================>----------]  85% with 0 failures
 Completed [=============================================================>----------]  86% with 0 failures
 Completed [=============================================================>----------]  87% with 0 failures
 Completed [==============================================================>---------]  87% with 0 failures
 Completed [==============================================================>---------]  88% with 0 failures
 Completed [===============================================================>--------]  88% with 0 failures
 Completed [===============================================================>--------]  89% with 0 failures
 Completed [===============================================================>--------]  90% with 0 failures
 Completed [================================================================>-------]  90% with 0 failures
 Completed [================================================================>-------]  91% with 0 failures
 Completed [=================================================================>------]  91% with 0 failures
 Completed [=================================================================>------]  92% with 0 failures
 Completed [==================================================================>-----]  92% with 0 failures
 Completed [==================================================================>-----]  93% with 0 failures
 Completed [==================================================================>-----]  94% with 0 failures
 Completed [===================================================================>----]  94% with 0 failures
 Completed [===================================================================>----]  95% with 0 failures
 Completed [====================================================================>---]  95% with 0 failures
 Completed [====================================================================>---]  96% with 0 failures
 Completed [====================================================================>---]  97% with 0 failures
 Completed [=====================================================================>--]  97% with 0 failures
 Completed [=====================================================================>--]  98% with 0 failures
 Completed [======================================================================>-]  98% with 0 failures
 Completed [======================================================================>-]  99% with 0 failures
 Completed [=======================================================================>]  99% with 0 failures
 Completed [=======================================================================>] 100% with 0 failures
 Completed [========================================================================] 100% with 0 failures
                                                                                                          

Done!
md4_markers <- md4_markers[md4_markers$p_val_adj < 0.05, ]
head(md4_markers, n = 15)
md4_markers_annotated <- merge(gene_annotations, md4_markers, by.x = "Gene.ID", by.y = 0)
View(md4_markers_annotated)
VlnPlot(cells.12, features = c("PBANKA-1209800", "PBANKA-0211500", "PBANKA-1222900", "PBANKA-1312700"), group.by = "identity_combined", pt.size = 0, combine = FALSE, slot = "data", assay = "RNA")
[[1]]

[[2]]

[[3]]

[[4]]

md5

cells.10 <- subset(tenx.mutant.integrated.sex, idents = "10")
DefaultAssay(cells.10) <- "RNA"
Idents(cells.10) <- "identity_combined"
md5_markers <- FindMarkers(cells.10, ident.1 = "md5", ident.2 = c("wild-type (10x)", "wild-type (Smart-seq2)"), test.use = "MAST", verbose = FALSE)
Assuming data assay in position 1, with name et is log-transformed.

 Completed [=>----------------------------------------------------------------------]   2% with 0 failures
 Completed [=>----------------------------------------------------------------------]   3% with 0 failures
 Completed [==>---------------------------------------------------------------------]   3% with 0 failures
 Completed [==>---------------------------------------------------------------------]   4% with 0 failures
 Completed [==>---------------------------------------------------------------------]   5% with 0 failures
 Completed [===>--------------------------------------------------------------------]   5% with 0 failures
 Completed [===>--------------------------------------------------------------------]   6% with 0 failures
 Completed [====>-------------------------------------------------------------------]   6% with 0 failures
 Completed [====>-------------------------------------------------------------------]   7% with 0 failures
 Completed [====>-------------------------------------------------------------------]   8% with 0 failures
 Completed [=====>------------------------------------------------------------------]   8% with 0 failures
 Completed [=====>------------------------------------------------------------------]   9% with 0 failures
 Completed [======>-----------------------------------------------------------------]   9% with 0 failures
 Completed [======>-----------------------------------------------------------------]  10% with 0 failures
 Completed [=======>----------------------------------------------------------------]  10% with 0 failures
 Completed [=======>----------------------------------------------------------------]  11% with 0 failures
 Completed [=======>----------------------------------------------------------------]  12% with 0 failures
 Completed [========>---------------------------------------------------------------]  12% with 0 failures
 Completed [========>---------------------------------------------------------------]  13% with 0 failures
 Completed [=========>--------------------------------------------------------------]  13% with 0 failures
 Completed [=========>--------------------------------------------------------------]  14% with 0 failures
 Completed [=========>--------------------------------------------------------------]  15% with 0 failures
 Completed [==========>-------------------------------------------------------------]  15% with 0 failures
 Completed [==========>-------------------------------------------------------------]  16% with 0 failures
 Completed [===========>------------------------------------------------------------]  16% with 0 failures
 Completed [===========>------------------------------------------------------------]  17% with 0 failures
 Completed [============>-----------------------------------------------------------]  17% with 0 failures
 Completed [============>-----------------------------------------------------------]  18% with 0 failures
 Completed [============>-----------------------------------------------------------]  19% with 0 failures
 Completed [=============>----------------------------------------------------------]  19% with 0 failures
 Completed [=============>----------------------------------------------------------]  20% with 0 failures
 Completed [==============>---------------------------------------------------------]  20% with 0 failures
 Completed [==============>---------------------------------------------------------]  21% with 0 failures
 Completed [==============>---------------------------------------------------------]  22% with 0 failures
 Completed [===============>--------------------------------------------------------]  22% with 0 failures
 Completed [===============>--------------------------------------------------------]  23% with 0 failures
 Completed [================>-------------------------------------------------------]  23% with 0 failures
 Completed [================>-------------------------------------------------------]  24% with 0 failures
 Completed [=================>------------------------------------------------------]  24% with 0 failures
 Completed [=================>------------------------------------------------------]  25% with 0 failures
 Completed [=================>------------------------------------------------------]  26% with 0 failures
 Completed [==================>-----------------------------------------------------]  26% with 0 failures
 Completed [==================>-----------------------------------------------------]  27% with 0 failures
 Completed [===================>----------------------------------------------------]  27% with 0 failures
 Completed [===================>----------------------------------------------------]  28% with 0 failures
 Completed [====================>---------------------------------------------------]  29% with 0 failures
 Completed [====================>---------------------------------------------------]  30% with 0 failures
 Completed [=====================>--------------------------------------------------]  30% with 0 failures
 Completed [=====================>--------------------------------------------------]  31% with 0 failures
 Completed [======================>-------------------------------------------------]  31% with 0 failures
 Completed [======================>-------------------------------------------------]  32% with 0 failures
 Completed [======================>-------------------------------------------------]  33% with 0 failures
 Completed [=======================>------------------------------------------------]  33% with 0 failures
 Completed [=======================>------------------------------------------------]  34% with 0 failures
 Completed [========================>-----------------------------------------------]  34% with 0 failures
 Completed [========================>-----------------------------------------------]  35% with 0 failures
 Completed [=========================>----------------------------------------------]  35% with 0 failures
 Completed [=========================>----------------------------------------------]  36% with 0 failures
 Completed [=========================>----------------------------------------------]  37% with 0 failures
 Completed [==========================>---------------------------------------------]  37% with 0 failures
 Completed [==========================>---------------------------------------------]  38% with 0 failures
 Completed [===========================>--------------------------------------------]  38% with 0 failures
 Completed [===========================>--------------------------------------------]  39% with 0 failures
 Completed [===========================>--------------------------------------------]  40% with 0 failures
 Completed [============================>-------------------------------------------]  40% with 0 failures
 Completed [============================>-------------------------------------------]  41% with 0 failures
 Completed [=============================>------------------------------------------]  41% with 0 failures
 Completed [=============================>------------------------------------------]  42% with 0 failures
 Completed [==============================>-----------------------------------------]  42% with 0 failures
 Completed [==============================>-----------------------------------------]  43% with 0 failures
 Completed [==============================>-----------------------------------------]  44% with 0 failures
 Completed [===============================>----------------------------------------]  44% with 0 failures
 Completed [===============================>----------------------------------------]  45% with 0 failures
 Completed [================================>---------------------------------------]  45% with 0 failures
 Completed [================================>---------------------------------------]  46% with 0 failures
 Completed [=================================>--------------------------------------]  47% with 0 failures
 Completed [=================================>--------------------------------------]  48% with 0 failures
 Completed [==================================>-------------------------------------]  48% with 0 failures
 Completed [==================================>-------------------------------------]  49% with 0 failures
 Completed [===================================>------------------------------------]  49% with 0 failures
 Completed [===================================>------------------------------------]  50% with 0 failures
 Completed [===================================>------------------------------------]  51% with 0 failures
 Completed [====================================>-----------------------------------]  51% with 0 failures
 Completed [====================================>-----------------------------------]  52% with 0 failures
 Completed [=====================================>----------------------------------]  52% with 0 failures
 Completed [=====================================>----------------------------------]  53% with 0 failures
 Completed [======================================>---------------------------------]  54% with 0 failures
 Completed [======================================>---------------------------------]  55% with 0 failures
 Completed [=======================================>--------------------------------]  55% with 0 failures
 Completed [=======================================>--------------------------------]  56% with 0 failures
 Completed [========================================>-------------------------------]  56% with 0 failures
 Completed [========================================>-------------------------------]  57% with 0 failures
 Completed [========================================>-------------------------------]  58% with 0 failures
 Completed [=========================================>------------------------------]  58% with 0 failures
 Completed [=========================================>------------------------------]  59% with 0 failures
 Completed [==========================================>-----------------------------]  59% with 0 failures
 Completed [==========================================>-----------------------------]  60% with 0 failures
 Completed [===========================================>----------------------------]  60% with 0 failures
 Completed [===========================================>----------------------------]  61% with 0 failures
 Completed [===========================================>----------------------------]  62% with 0 failures
 Completed [============================================>---------------------------]  62% with 0 failures
 Completed [============================================>---------------------------]  63% with 0 failures
 Completed [=============================================>--------------------------]  63% with 0 failures
 Completed [=============================================>--------------------------]  64% with 0 failures
 Completed [=============================================>--------------------------]  65% with 0 failures
 Completed [==============================================>-------------------------]  65% with 0 failures
 Completed [==============================================>-------------------------]  66% with 0 failures
 Completed [===============================================>------------------------]  66% with 0 failures
 Completed [===============================================>------------------------]  67% with 0 failures
 Completed [================================================>-----------------------]  67% with 0 failures
 Completed [================================================>-----------------------]  68% with 0 failures
 Completed [================================================>-----------------------]  69% with 0 failures
 Completed [=================================================>----------------------]  69% with 0 failures
 Completed [=================================================>----------------------]  70% with 0 failures
 Completed [==================================================>---------------------]  70% with 0 failures
 Completed [==================================================>---------------------]  71% with 0 failures
 Completed [===================================================>--------------------]  72% with 0 failures
 Completed [===================================================>--------------------]  73% with 0 failures
 Completed [====================================================>-------------------]  73% with 0 failures
 Completed [====================================================>-------------------]  74% with 0 failures
 Completed [=====================================================>------------------]  74% with 0 failures
 Completed [=====================================================>------------------]  75% with 0 failures
 Completed [=====================================================>------------------]  76% with 0 failures
 Completed [======================================================>-----------------]  76% with 0 failures
 Completed [======================================================>-----------------]  77% with 0 failures
 Completed [=======================================================>----------------]  77% with 0 failures
 Completed [=======================================================>----------------]  78% with 0 failures
 Completed [========================================================>---------------]  78% with 0 failures
 Completed [========================================================>---------------]  79% with 0 failures
 Completed [========================================================>---------------]  80% with 0 failures
 Completed [=========================================================>--------------]  80% with 0 failures
 Completed [=========================================================>--------------]  81% with 0 failures
 Completed [==========================================================>-------------]  81% with 0 failures
 Completed [==========================================================>-------------]  82% with 0 failures
 Completed [==========================================================>-------------]  83% with 0 failures
 Completed [===========================================================>------------]  83% with 0 failures
 Completed [===========================================================>------------]  84% with 0 failures
 Completed [============================================================>-----------]  84% with 0 failures
 Completed [============================================================>-----------]  85% with 0 failures
 Completed [=============================================================>----------]  85% with 0 failures
 Completed [=============================================================>----------]  86% with 0 failures
 Completed [=============================================================>----------]  87% with 0 failures
 Completed [==============================================================>---------]  87% with 0 failures
 Completed [==============================================================>---------]  88% with 0 failures
 Completed [===============================================================>--------]  88% with 0 failures
 Completed [===============================================================>--------]  89% with 0 failures
 Completed [===============================================================>--------]  90% with 0 failures
 Completed [================================================================>-------]  90% with 0 failures
 Completed [================================================================>-------]  91% with 0 failures
 Completed [=================================================================>------]  91% with 0 failures
 Completed [=================================================================>------]  92% with 0 failures
 Completed [==================================================================>-----]  92% with 0 failures
 Completed [==================================================================>-----]  93% with 0 failures
 Completed [==================================================================>-----]  94% with 0 failures
 Completed [===================================================================>----]  94% with 0 failures
 Completed [===================================================================>----]  95% with 0 failures
 Completed [====================================================================>---]  95% with 0 failures
 Completed [====================================================================>---]  96% with 0 failures
 Completed [====================================================================>---]  97% with 0 failures
 Completed [=====================================================================>--]  97% with 0 failures
 Completed [=====================================================================>--]  98% with 0 failures
 Completed [======================================================================>-]  98% with 0 failures
 Completed [======================================================================>-]  99% with 0 failures
 Completed [=======================================================================>]  99% with 0 failures
 Completed [=======================================================================>] 100% with 0 failures
 Completed [========================================================================] 100% with 0 failures
                                                                                                          

Done!
Combining coefficients and standard errors
Calculating log-fold changes
Calculating likelihood ratio tests
Refitting on reduced model...

 Completed [=>----------------------------------------------------------------------]   3% with 0 failures
 Completed [==>---------------------------------------------------------------------]   3% with 0 failures
 Completed [==>---------------------------------------------------------------------]   4% with 0 failures
 Completed [==>---------------------------------------------------------------------]   5% with 0 failures
 Completed [===>--------------------------------------------------------------------]   5% with 0 failures
 Completed [===>--------------------------------------------------------------------]   6% with 0 failures
 Completed [====>-------------------------------------------------------------------]   6% with 0 failures
 Completed [====>-------------------------------------------------------------------]   7% with 0 failures
 Completed [====>-------------------------------------------------------------------]   8% with 0 failures
 Completed [=====>------------------------------------------------------------------]   8% with 0 failures
 Completed [=====>------------------------------------------------------------------]   9% with 0 failures
 Completed [======>-----------------------------------------------------------------]   9% with 0 failures
 Completed [======>-----------------------------------------------------------------]  10% with 0 failures
 Completed [=======>----------------------------------------------------------------]  10% with 0 failures
 Completed [=======>----------------------------------------------------------------]  11% with 0 failures
 Completed [=======>----------------------------------------------------------------]  12% with 0 failures
 Completed [========>---------------------------------------------------------------]  12% with 0 failures
 Completed [========>---------------------------------------------------------------]  13% with 0 failures
 Completed [=========>--------------------------------------------------------------]  13% with 0 failures
 Completed [=========>--------------------------------------------------------------]  14% with 0 failures
 Completed [=========>--------------------------------------------------------------]  15% with 0 failures
 Completed [==========>-------------------------------------------------------------]  15% with 0 failures
 Completed [==========>-------------------------------------------------------------]  16% with 0 failures
 Completed [===========>------------------------------------------------------------]  16% with 0 failures
 Completed [===========>------------------------------------------------------------]  17% with 0 failures
 Completed [============>-----------------------------------------------------------]  17% with 0 failures
 Completed [============>-----------------------------------------------------------]  18% with 0 failures
 Completed [============>-----------------------------------------------------------]  19% with 0 failures
 Completed [=============>----------------------------------------------------------]  19% with 0 failures
 Completed [=============>----------------------------------------------------------]  20% with 0 failures
 Completed [==============>---------------------------------------------------------]  20% with 0 failures
 Completed [==============>---------------------------------------------------------]  21% with 0 failures
 Completed [==============>---------------------------------------------------------]  22% with 0 failures
 Completed [===============>--------------------------------------------------------]  22% with 0 failures
 Completed [===============>--------------------------------------------------------]  23% with 0 failures
 Completed [================>-------------------------------------------------------]  23% with 0 failures
 Completed [================>-------------------------------------------------------]  24% with 0 failures
 Completed [=================>------------------------------------------------------]  24% with 0 failures
 Completed [=================>------------------------------------------------------]  25% with 0 failures
 Completed [=================>------------------------------------------------------]  26% with 0 failures
 Completed [==================>-----------------------------------------------------]  26% with 0 failures
 Completed [==================>-----------------------------------------------------]  27% with 0 failures
 Completed [===================>----------------------------------------------------]  27% with 0 failures
 Completed [===================>----------------------------------------------------]  28% with 0 failures
 Completed [====================>---------------------------------------------------]  29% with 0 failures
 Completed [====================>---------------------------------------------------]  30% with 0 failures
 Completed [=====================>--------------------------------------------------]  30% with 0 failures
 Completed [=====================>--------------------------------------------------]  31% with 0 failures
 Completed [======================>-------------------------------------------------]  31% with 0 failures
 Completed [======================>-------------------------------------------------]  32% with 0 failures
 Completed [======================>-------------------------------------------------]  33% with 0 failures
 Completed [=======================>------------------------------------------------]  33% with 0 failures
 Completed [=======================>------------------------------------------------]  34% with 0 failures
 Completed [========================>-----------------------------------------------]  34% with 0 failures
 Completed [========================>-----------------------------------------------]  35% with 0 failures
 Completed [=========================>----------------------------------------------]  35% with 0 failures
 Completed [=========================>----------------------------------------------]  36% with 0 failures
 Completed [=========================>----------------------------------------------]  37% with 0 failures
 Completed [==========================>---------------------------------------------]  37% with 0 failures
 Completed [==========================>---------------------------------------------]  38% with 0 failures
 Completed [===========================>--------------------------------------------]  38% with 0 failures
 Completed [===========================>--------------------------------------------]  39% with 0 failures
 Completed [===========================>--------------------------------------------]  40% with 0 failures
 Completed [============================>-------------------------------------------]  40% with 0 failures
 Completed [============================>-------------------------------------------]  41% with 0 failures
 Completed [=============================>------------------------------------------]  41% with 0 failures
 Completed [=============================>------------------------------------------]  42% with 0 failures
 Completed [==============================>-----------------------------------------]  42% with 0 failures
 Completed [==============================>-----------------------------------------]  43% with 0 failures
 Completed [==============================>-----------------------------------------]  44% with 0 failures
 Completed [===============================>----------------------------------------]  44% with 0 failures
 Completed [===============================>----------------------------------------]  45% with 0 failures
 Completed [================================>---------------------------------------]  45% with 0 failures
 Completed [================================>---------------------------------------]  46% with 0 failures
 Completed [=================================>--------------------------------------]  47% with 0 failures
 Completed [=================================>--------------------------------------]  48% with 0 failures
 Completed [==================================>-------------------------------------]  48% with 0 failures
 Completed [==================================>-------------------------------------]  49% with 0 failures
 Completed [===================================>------------------------------------]  49% with 0 failures
 Completed [===================================>------------------------------------]  50% with 0 failures
 Completed [===================================>------------------------------------]  51% with 0 failures
 Completed [====================================>-----------------------------------]  51% with 0 failures
 Completed [====================================>-----------------------------------]  52% with 0 failures
 Completed [=====================================>----------------------------------]  52% with 0 failures
 Completed [=====================================>----------------------------------]  53% with 0 failures
 Completed [======================================>---------------------------------]  54% with 0 failures
 Completed [======================================>---------------------------------]  55% with 0 failures
 Completed [=======================================>--------------------------------]  55% with 0 failures
 Completed [=======================================>--------------------------------]  56% with 0 failures
 Completed [========================================>-------------------------------]  56% with 0 failures
 Completed [========================================>-------------------------------]  57% with 0 failures
 Completed [========================================>-------------------------------]  58% with 0 failures
 Completed [=========================================>------------------------------]  58% with 0 failures
 Completed [=========================================>------------------------------]  59% with 0 failures
 Completed [==========================================>-----------------------------]  59% with 0 failures
 Completed [==========================================>-----------------------------]  60% with 0 failures
 Completed [===========================================>----------------------------]  60% with 0 failures
 Completed [===========================================>----------------------------]  61% with 0 failures
 Completed [===========================================>----------------------------]  62% with 0 failures
 Completed [============================================>---------------------------]  62% with 0 failures
 Completed [============================================>---------------------------]  63% with 0 failures
 Completed [=============================================>--------------------------]  63% with 0 failures
 Completed [=============================================>--------------------------]  64% with 0 failures
 Completed [=============================================>--------------------------]  65% with 0 failures
 Completed [==============================================>-------------------------]  65% with 0 failures
 Completed [==============================================>-------------------------]  66% with 0 failures
 Completed [===============================================>------------------------]  66% with 0 failures
 Completed [===============================================>------------------------]  67% with 0 failures
 Completed [================================================>-----------------------]  67% with 0 failures
 Completed [================================================>-----------------------]  68% with 0 failures
 Completed [================================================>-----------------------]  69% with 0 failures
 Completed [=================================================>----------------------]  69% with 0 failures
 Completed [=================================================>----------------------]  70% with 0 failures
 Completed [==================================================>---------------------]  70% with 0 failures
 Completed [==================================================>---------------------]  71% with 0 failures
 Completed [===================================================>--------------------]  72% with 0 failures
 Completed [===================================================>--------------------]  73% with 0 failures
 Completed [====================================================>-------------------]  73% with 0 failures
 Completed [====================================================>-------------------]  74% with 0 failures
 Completed [=====================================================>------------------]  74% with 0 failures
 Completed [=====================================================>------------------]  75% with 0 failures
 Completed [=====================================================>------------------]  76% with 0 failures
 Completed [======================================================>-----------------]  76% with 0 failures
 Completed [======================================================>-----------------]  77% with 0 failures
 Completed [=======================================================>----------------]  77% with 0 failures
 Completed [=======================================================>----------------]  78% with 0 failures
 Completed [========================================================>---------------]  78% with 0 failures
 Completed [========================================================>---------------]  79% with 0 failures
 Completed [========================================================>---------------]  80% with 0 failures
 Completed [=========================================================>--------------]  80% with 0 failures
 Completed [=========================================================>--------------]  81% with 0 failures
 Completed [==========================================================>-------------]  81% with 0 failures
 Completed [==========================================================>-------------]  82% with 0 failures
 Completed [==========================================================>-------------]  83% with 0 failures
 Completed [===========================================================>------------]  83% with 0 failures
 Completed [===========================================================>------------]  84% with 0 failures
 Completed [============================================================>-----------]  84% with 0 failures
 Completed [============================================================>-----------]  85% with 0 failures
 Completed [=============================================================>----------]  85% with 0 failures
 Completed [=============================================================>----------]  86% with 0 failures
 Completed [=============================================================>----------]  87% with 0 failures
 Completed [==============================================================>---------]  87% with 0 failures
 Completed [==============================================================>---------]  88% with 0 failures
 Completed [===============================================================>--------]  88% with 0 failures
 Completed [===============================================================>--------]  89% with 0 failures
 Completed [===============================================================>--------]  90% with 0 failures
 Completed [================================================================>-------]  90% with 0 failures
 Completed [================================================================>-------]  91% with 0 failures
 Completed [=================================================================>------]  91% with 0 failures
 Completed [=================================================================>------]  92% with 0 failures
 Completed [==================================================================>-----]  92% with 0 failures
 Completed [==================================================================>-----]  93% with 0 failures
 Completed [==================================================================>-----]  94% with 0 failures
 Completed [===================================================================>----]  94% with 0 failures
 Completed [===================================================================>----]  95% with 0 failures
 Completed [====================================================================>---]  95% with 0 failures
 Completed [====================================================================>---]  96% with 0 failures
 Completed [====================================================================>---]  97% with 0 failures
 Completed [=====================================================================>--]  97% with 0 failures
 Completed [=====================================================================>--]  98% with 0 failures
 Completed [======================================================================>-]  98% with 0 failures
 Completed [======================================================================>-]  99% with 0 failures
 Completed [=======================================================================>]  99% with 0 failures
 Completed [=======================================================================>] 100% with 0 failures
 Completed [========================================================================] 100% with 0 failures
                                                                                                          

Done!
md5_markers <- md5_markers[md5_markers$p_val_adj < 0.05, ]
head(md5_markers, n = 15)
md5_markers_annotated <- merge(gene_annotations, md5_markers, by.x = "Gene.ID", by.y = 0)
View(md5_markers_annotated)

gd1

cells.12 <- subset(tenx.mutant.integrated.sex, idents = "12")
DefaultAssay(cells.12) <- "RNA"
Idents(cells.12) <- "identity_combined"
gd1_markers <- FindMarkers(cells.12, ident.1 = "gd1", ident.2 = c("wild-type (10x)", "wild-type (Smart-seq2)"), test.use = "MAST", verbose = FALSE)
Assuming data assay in position 1, with name et is log-transformed.

 Completed [>-----------------------------------------------------------------------]   2% with 0 failures
 Completed [=>----------------------------------------------------------------------]   2% with 0 failures
 Completed [=>----------------------------------------------------------------------]   3% with 0 failures
 Completed [==>---------------------------------------------------------------------]   4% with 0 failures
 Completed [==>---------------------------------------------------------------------]   5% with 0 failures
 Completed [===>--------------------------------------------------------------------]   5% with 0 failures
 Completed [===>--------------------------------------------------------------------]   6% with 0 failures
 Completed [====>-------------------------------------------------------------------]   6% with 0 failures
 Completed [====>-------------------------------------------------------------------]   7% with 0 failures
 Completed [====>-------------------------------------------------------------------]   8% with 0 failures
 Completed [=====>------------------------------------------------------------------]   8% with 0 failures
 Completed [=====>------------------------------------------------------------------]   9% with 0 failures
 Completed [======>-----------------------------------------------------------------]   9% with 0 failures
 Completed [======>-----------------------------------------------------------------]  10% with 0 failures
 Completed [=======>----------------------------------------------------------------]  10% with 0 failures
 Completed [=======>----------------------------------------------------------------]  11% with 0 failures
 Completed [=======>----------------------------------------------------------------]  12% with 0 failures
 Completed [========>---------------------------------------------------------------]  12% with 0 failures
 Completed [========>---------------------------------------------------------------]  13% with 0 failures
 Completed [=========>--------------------------------------------------------------]  13% with 0 failures
 Completed [=========>--------------------------------------------------------------]  14% with 0 failures
 Completed [=========>--------------------------------------------------------------]  15% with 0 failures
 Completed [==========>-------------------------------------------------------------]  15% with 0 failures
 Completed [==========>-------------------------------------------------------------]  16% with 0 failures
 Completed [===========>------------------------------------------------------------]  16% with 0 failures
 Completed [===========>------------------------------------------------------------]  17% with 0 failures
 Completed [============>-----------------------------------------------------------]  17% with 0 failures
 Completed [============>-----------------------------------------------------------]  18% with 0 failures
 Completed [============>-----------------------------------------------------------]  19% with 0 failures
 Completed [=============>----------------------------------------------------------]  19% with 0 failures
 Completed [=============>----------------------------------------------------------]  20% with 0 failures
 Completed [==============>---------------------------------------------------------]  20% with 0 failures
 Completed [==============>---------------------------------------------------------]  21% with 0 failures
 Completed [==============>---------------------------------------------------------]  22% with 0 failures
 Completed [===============>--------------------------------------------------------]  22% with 0 failures
 Completed [===============>--------------------------------------------------------]  23% with 0 failures
 Completed [================>-------------------------------------------------------]  23% with 0 failures
 Completed [================>-------------------------------------------------------]  24% with 0 failures
 Completed [=================>------------------------------------------------------]  24% with 0 failures
 Completed [=================>------------------------------------------------------]  25% with 0 failures
 Completed [=================>------------------------------------------------------]  26% with 0 failures
 Completed [==================>-----------------------------------------------------]  26% with 0 failures
 Completed [==================>-----------------------------------------------------]  27% with 0 failures
 Completed [===================>----------------------------------------------------]  27% with 0 failures
 Completed [===================>----------------------------------------------------]  28% with 0 failures
 Completed [====================>---------------------------------------------------]  28% with 0 failures
 Completed [====================>---------------------------------------------------]  29% with 0 failures
 Completed [====================>---------------------------------------------------]  30% with 0 failures
 Completed [=====================>--------------------------------------------------]  30% with 0 failures
 Completed [=====================>--------------------------------------------------]  31% with 0 failures
 Completed [======================>-------------------------------------------------]  31% with 0 failures
 Completed [======================>-------------------------------------------------]  32% with 0 failures
 Completed [======================>-------------------------------------------------]  33% with 0 failures
 Completed [=======================>------------------------------------------------]  33% with 0 failures
 Completed [=======================>------------------------------------------------]  34% with 0 failures
 Completed [========================>-----------------------------------------------]  34% with 0 failures
 Completed [========================>-----------------------------------------------]  35% with 0 failures
 Completed [=========================>----------------------------------------------]  35% with 0 failures
 Completed [=========================>----------------------------------------------]  36% with 0 failures
 Completed [=========================>----------------------------------------------]  37% with 0 failures
 Completed [==========================>---------------------------------------------]  37% with 0 failures
 Completed [==========================>---------------------------------------------]  38% with 0 failures
 Completed [===========================>--------------------------------------------]  38% with 0 failures
 Completed [===========================>--------------------------------------------]  39% with 0 failures
 Completed [===========================>--------------------------------------------]  40% with 0 failures
 Completed [============================>-------------------------------------------]  40% with 0 failures
 Completed [============================>-------------------------------------------]  41% with 0 failures
 Completed [=============================>------------------------------------------]  41% with 0 failures
 Completed [=============================>------------------------------------------]  42% with 0 failures
 Completed [==============================>-----------------------------------------]  42% with 0 failures
 Completed [==============================>-----------------------------------------]  43% with 0 failures
 Completed [==============================>-----------------------------------------]  44% with 0 failures
 Completed [===============================>----------------------------------------]  44% with 0 failures
 Completed [===============================>----------------------------------------]  45% with 0 failures
 Completed [================================>---------------------------------------]  45% with 0 failures
 Completed [================================>---------------------------------------]  46% with 0 failures
 Completed [================================>---------------------------------------]  47% with 0 failures
 Completed [=================================>--------------------------------------]  47% with 0 failures
 Completed [=================================>--------------------------------------]  48% with 0 failures
 Completed [==================================>-------------------------------------]  48% with 0 failures
 Completed [==================================>-------------------------------------]  49% with 0 failures
 Completed [===================================>------------------------------------]  49% with 0 failures
 Completed [===================================>------------------------------------]  50% with 0 failures
 Completed [===================================>------------------------------------]  51% with 0 failures
 Completed [====================================>-----------------------------------]  51% with 0 failures
 Completed [====================================>-----------------------------------]  52% with 0 failures
 Completed [=====================================>----------------------------------]  52% with 0 failures
 Completed [=====================================>----------------------------------]  53% with 0 failures
 Completed [======================================>---------------------------------]  53% with 0 failures
 Completed [======================================>---------------------------------]  54% with 0 failures
 Completed [======================================>---------------------------------]  55% with 0 failures
 Completed [=======================================>--------------------------------]  55% with 0 failures
 Completed [=======================================>--------------------------------]  56% with 0 failures
 Completed [========================================>-------------------------------]  56% with 0 failures
 Completed [========================================>-------------------------------]  57% with 0 failures
 Completed [========================================>-------------------------------]  58% with 0 failures
 Completed [=========================================>------------------------------]  58% with 0 failures
 Completed [=========================================>------------------------------]  59% with 0 failures
 Completed [==========================================>-----------------------------]  59% with 0 failures
 Completed [==========================================>-----------------------------]  60% with 0 failures
 Completed [===========================================>----------------------------]  60% with 0 failures
 Completed [===========================================>----------------------------]  61% with 0 failures
 Completed [===========================================>----------------------------]  62% with 0 failures
 Completed [============================================>---------------------------]  62% with 0 failures
 Completed [============================================>---------------------------]  63% with 0 failures
 Completed [=============================================>--------------------------]  63% with 0 failures
 Completed [=============================================>--------------------------]  64% with 0 failures
 Completed [=============================================>--------------------------]  65% with 0 failures
 Completed [==============================================>-------------------------]  65% with 0 failures
 Completed [==============================================>-------------------------]  66% with 0 failures
 Completed [===============================================>------------------------]  66% with 0 failures
 Completed [===============================================>------------------------]  67% with 0 failures
 Completed [================================================>-----------------------]  67% with 0 failures
 Completed [================================================>-----------------------]  68% with 0 failures
 Completed [================================================>-----------------------]  69% with 0 failures
 Completed [=================================================>----------------------]  69% with 0 failures
 Completed [=================================================>----------------------]  70% with 0 failures
 Completed [==================================================>---------------------]  70% with 0 failures
 Completed [==================================================>---------------------]  71% with 0 failures
 Completed [==================================================>---------------------]  72% with 0 failures
 Completed [===================================================>--------------------]  72% with 0 failures
 Completed [===================================================>--------------------]  73% with 0 failures
 Completed [====================================================>-------------------]  73% with 0 failures
 Completed [====================================================>-------------------]  74% with 0 failures
 Completed [=====================================================>------------------]  74% with 0 failures
 Completed [=====================================================>------------------]  75% with 0 failures
 Completed [=====================================================>------------------]  76% with 0 failures
 Completed [======================================================>-----------------]  76% with 0 failures
 Completed [======================================================>-----------------]  77% with 0 failures
 Completed [=======================================================>----------------]  77% with 0 failures
 Completed [=======================================================>----------------]  78% with 0 failures
 Completed [========================================================>---------------]  78% with 0 failures
 Completed [========================================================>---------------]  79% with 0 failures
 Completed [========================================================>---------------]  80% with 0 failures
 Completed [=========================================================>--------------]  80% with 0 failures
 Completed [=========================================================>--------------]  81% with 0 failures
 Completed [==========================================================>-------------]  81% with 0 failures
 Completed [==========================================================>-------------]  82% with 0 failures
 Completed [==========================================================>-------------]  83% with 0 failures
 Completed [===========================================================>------------]  83% with 0 failures
 Completed [===========================================================>------------]  84% with 0 failures
 Completed [============================================================>-----------]  84% with 0 failures
 Completed [============================================================>-----------]  85% with 0 failures
 Completed [=============================================================>----------]  85% with 0 failures
 Completed [=============================================================>----------]  86% with 0 failures
 Completed [=============================================================>----------]  87% with 0 failures
 Completed [==============================================================>---------]  87% with 0 failures
 Completed [==============================================================>---------]  88% with 0 failures
 Completed [===============================================================>--------]  88% with 0 failures
 Completed [===============================================================>--------]  89% with 0 failures
 Completed [===============================================================>--------]  90% with 0 failures
 Completed [================================================================>-------]  90% with 0 failures
 Completed [================================================================>-------]  91% with 0 failures
 Completed [=================================================================>------]  91% with 0 failures
 Completed [=================================================================>------]  92% with 0 failures
 Completed [==================================================================>-----]  92% with 0 failures
 Completed [==================================================================>-----]  93% with 0 failures
 Completed [==================================================================>-----]  94% with 0 failures
 Completed [===================================================================>----]  94% with 0 failures
 Completed [===================================================================>----]  95% with 0 failures
 Completed [====================================================================>---]  95% with 0 failures
 Completed [====================================================================>---]  96% with 0 failures
 Completed [=====================================================================>--]  97% with 0 failures
 Completed [=====================================================================>--]  98% with 0 failures
 Completed [======================================================================>-]  98% with 0 failures
 Completed [======================================================================>-]  99% with 0 failures
 Completed [=======================================================================>]  99% with 0 failures
 Completed [=======================================================================>] 100% with 0 failures
 Completed [========================================================================] 100% with 0 failures
                                                                                                          

Done!
Combining coefficients and standard errors
Calculating log-fold changes
Calculating likelihood ratio tests
Refitting on reduced model...

 Completed [>-----------------------------------------------------------------------]   1% with 0 failures
 Completed [>-----------------------------------------------------------------------]   2% with 0 failures
 Completed [=>----------------------------------------------------------------------]   2% with 0 failures
 Completed [=>----------------------------------------------------------------------]   3% with 0 failures
 Completed [==>---------------------------------------------------------------------]   4% with 0 failures
 Completed [==>---------------------------------------------------------------------]   5% with 0 failures
 Completed [===>--------------------------------------------------------------------]   5% with 0 failures
 Completed [===>--------------------------------------------------------------------]   6% with 0 failures
 Completed [====>-------------------------------------------------------------------]   6% with 0 failures
 Completed [====>-------------------------------------------------------------------]   7% with 0 failures
 Completed [====>-------------------------------------------------------------------]   8% with 0 failures
 Completed [=====>------------------------------------------------------------------]   8% with 0 failures
 Completed [=====>------------------------------------------------------------------]   9% with 0 failures
 Completed [======>-----------------------------------------------------------------]   9% with 0 failures
 Completed [======>-----------------------------------------------------------------]  10% with 0 failures
 Completed [=======>----------------------------------------------------------------]  10% with 0 failures
 Completed [=======>----------------------------------------------------------------]  11% with 0 failures
 Completed [=======>----------------------------------------------------------------]  12% with 0 failures
 Completed [========>---------------------------------------------------------------]  12% with 0 failures
 Completed [========>---------------------------------------------------------------]  13% with 0 failures
 Completed [=========>--------------------------------------------------------------]  13% with 0 failures
 Completed [=========>--------------------------------------------------------------]  14% with 0 failures
 Completed [=========>--------------------------------------------------------------]  15% with 0 failures
 Completed [==========>-------------------------------------------------------------]  15% with 0 failures
 Completed [==========>-------------------------------------------------------------]  16% with 0 failures
 Completed [===========>------------------------------------------------------------]  16% with 0 failures
 Completed [===========>------------------------------------------------------------]  17% with 0 failures
 Completed [============>-----------------------------------------------------------]  17% with 0 failures
 Completed [============>-----------------------------------------------------------]  18% with 0 failures
 Completed [============>-----------------------------------------------------------]  19% with 0 failures
 Completed [=============>----------------------------------------------------------]  19% with 0 failures
 Completed [=============>----------------------------------------------------------]  20% with 0 failures
 Completed [==============>---------------------------------------------------------]  20% with 0 failures
 Completed [==============>---------------------------------------------------------]  21% with 0 failures
 Completed [==============>---------------------------------------------------------]  22% with 0 failures
 Completed [===============>--------------------------------------------------------]  22% with 0 failures
 Completed [===============>--------------------------------------------------------]  23% with 0 failures
 Completed [================>-------------------------------------------------------]  23% with 0 failures
 Completed [================>-------------------------------------------------------]  24% with 0 failures
 Completed [=================>------------------------------------------------------]  24% with 0 failures
 Completed [=================>------------------------------------------------------]  25% with 0 failures
 Completed [=================>------------------------------------------------------]  26% with 0 failures
 Completed [==================>-----------------------------------------------------]  26% with 0 failures
 Completed [==================>-----------------------------------------------------]  27% with 0 failures
 Completed [===================>----------------------------------------------------]  27% with 0 failures
 Completed [===================>----------------------------------------------------]  28% with 0 failures
 Completed [====================>---------------------------------------------------]  28% with 0 failures
 Completed [====================>---------------------------------------------------]  29% with 0 failures
 Completed [====================>---------------------------------------------------]  30% with 0 failures
 Completed [=====================>--------------------------------------------------]  30% with 0 failures
 Completed [=====================>--------------------------------------------------]  31% with 0 failures
 Completed [======================>-------------------------------------------------]  31% with 0 failures
 Completed [======================>-------------------------------------------------]  32% with 0 failures
 Completed [======================>-------------------------------------------------]  33% with 0 failures
 Completed [=======================>------------------------------------------------]  33% with 0 failures
 Completed [=======================>------------------------------------------------]  34% with 0 failures
 Completed [========================>-----------------------------------------------]  34% with 0 failures
 Completed [========================>-----------------------------------------------]  35% with 0 failures
 Completed [=========================>----------------------------------------------]  35% with 0 failures
 Completed [=========================>----------------------------------------------]  36% with 0 failures
 Completed [=========================>----------------------------------------------]  37% with 0 failures
 Completed [==========================>---------------------------------------------]  37% with 0 failures
 Completed [==========================>---------------------------------------------]  38% with 0 failures
 Completed [===========================>--------------------------------------------]  38% with 0 failures
 Completed [===========================>--------------------------------------------]  39% with 0 failures
 Completed [===========================>--------------------------------------------]  40% with 0 failures
 Completed [============================>-------------------------------------------]  40% with 0 failures
 Completed [============================>-------------------------------------------]  41% with 0 failures
 Completed [=============================>------------------------------------------]  41% with 0 failures
 Completed [=============================>------------------------------------------]  42% with 0 failures
 Completed [==============================>-----------------------------------------]  42% with 0 failures
 Completed [==============================>-----------------------------------------]  43% with 0 failures
 Completed [==============================>-----------------------------------------]  44% with 0 failures
 Completed [===============================>----------------------------------------]  44% with 0 failures
 Completed [===============================>----------------------------------------]  45% with 0 failures
 Completed [================================>---------------------------------------]  45% with 0 failures
 Completed [================================>---------------------------------------]  46% with 0 failures
 Completed [================================>---------------------------------------]  47% with 0 failures
 Completed [=================================>--------------------------------------]  47% with 0 failures
 Completed [=================================>--------------------------------------]  48% with 0 failures
 Completed [==================================>-------------------------------------]  48% with 0 failures
 Completed [==================================>-------------------------------------]  49% with 0 failures
 Completed [===================================>------------------------------------]  49% with 0 failures
 Completed [===================================>------------------------------------]  50% with 0 failures
 Completed [===================================>------------------------------------]  51% with 0 failures
 Completed [====================================>-----------------------------------]  51% with 0 failures
 Completed [====================================>-----------------------------------]  52% with 0 failures
 Completed [=====================================>----------------------------------]  52% with 0 failures
 Completed [=====================================>----------------------------------]  53% with 0 failures
 Completed [======================================>---------------------------------]  53% with 0 failures
 Completed [======================================>---------------------------------]  54% with 0 failures
 Completed [======================================>---------------------------------]  55% with 0 failures
 Completed [=======================================>--------------------------------]  55% with 0 failures
 Completed [=======================================>--------------------------------]  56% with 0 failures
 Completed [========================================>-------------------------------]  56% with 0 failures
 Completed [========================================>-------------------------------]  57% with 0 failures
 Completed [========================================>-------------------------------]  58% with 0 failures
 Completed [=========================================>------------------------------]  58% with 0 failures
 Completed [=========================================>------------------------------]  59% with 0 failures
 Completed [==========================================>-----------------------------]  59% with 0 failures
 Completed [==========================================>-----------------------------]  60% with 0 failures
 Completed [===========================================>----------------------------]  60% with 0 failures
 Completed [===========================================>----------------------------]  61% with 0 failures
 Completed [===========================================>----------------------------]  62% with 0 failures
 Completed [============================================>---------------------------]  62% with 0 failures
 Completed [============================================>---------------------------]  63% with 0 failures
 Completed [=============================================>--------------------------]  63% with 0 failures
 Completed [=============================================>--------------------------]  64% with 0 failures
 Completed [=============================================>--------------------------]  65% with 0 failures
 Completed [==============================================>-------------------------]  65% with 0 failures
 Completed [==============================================>-------------------------]  66% with 0 failures
 Completed [===============================================>------------------------]  66% with 0 failures
 Completed [===============================================>------------------------]  67% with 0 failures
 Completed [================================================>-----------------------]  67% with 0 failures
 Completed [================================================>-----------------------]  68% with 0 failures
 Completed [================================================>-----------------------]  69% with 0 failures
 Completed [=================================================>----------------------]  69% with 0 failures
 Completed [=================================================>----------------------]  70% with 0 failures
 Completed [==================================================>---------------------]  70% with 0 failures
 Completed [==================================================>---------------------]  71% with 0 failures
 Completed [==================================================>---------------------]  72% with 0 failures
 Completed [===================================================>--------------------]  72% with 0 failures
 Completed [===================================================>--------------------]  73% with 0 failures
 Completed [====================================================>-------------------]  73% with 0 failures
 Completed [====================================================>-------------------]  74% with 0 failures
 Completed [=====================================================>------------------]  74% with 0 failures
 Completed [=====================================================>------------------]  75% with 0 failures
 Completed [=====================================================>------------------]  76% with 0 failures
 Completed [======================================================>-----------------]  76% with 0 failures
 Completed [======================================================>-----------------]  77% with 0 failures
 Completed [=======================================================>----------------]  77% with 0 failures
 Completed [=======================================================>----------------]  78% with 0 failures
 Completed [========================================================>---------------]  78% with 0 failures
 Completed [========================================================>---------------]  79% with 0 failures
 Completed [========================================================>---------------]  80% with 0 failures
 Completed [=========================================================>--------------]  80% with 0 failures
 Completed [=========================================================>--------------]  81% with 0 failures
 Completed [==========================================================>-------------]  81% with 0 failures
 Completed [==========================================================>-------------]  82% with 0 failures
 Completed [==========================================================>-------------]  83% with 0 failures
 Completed [===========================================================>------------]  83% with 0 failures
 Completed [===========================================================>------------]  84% with 0 failures
 Completed [============================================================>-----------]  84% with 0 failures
 Completed [============================================================>-----------]  85% with 0 failures
 Completed [=============================================================>----------]  85% with 0 failures
 Completed [=============================================================>----------]  86% with 0 failures
 Completed [=============================================================>----------]  87% with 0 failures
 Completed [==============================================================>---------]  87% with 0 failures
 Completed [==============================================================>---------]  88% with 0 failures
 Completed [===============================================================>--------]  88% with 0 failures
 Completed [===============================================================>--------]  89% with 0 failures
 Completed [===============================================================>--------]  90% with 0 failures
 Completed [================================================================>-------]  90% with 0 failures
 Completed [================================================================>-------]  91% with 0 failures
 Completed [=================================================================>------]  91% with 0 failures
 Completed [=================================================================>------]  92% with 0 failures
 Completed [==================================================================>-----]  92% with 0 failures
 Completed [==================================================================>-----]  93% with 0 failures
 Completed [==================================================================>-----]  94% with 0 failures
 Completed [===================================================================>----]  94% with 0 failures
 Completed [===================================================================>----]  95% with 0 failures
 Completed [====================================================================>---]  95% with 0 failures
 Completed [====================================================================>---]  96% with 0 failures
 Completed [=====================================================================>--]  97% with 0 failures
 Completed [=====================================================================>--]  98% with 0 failures
 Completed [======================================================================>-]  98% with 0 failures
 Completed [======================================================================>-]  99% with 0 failures
 Completed [=======================================================================>]  99% with 0 failures
 Completed [=======================================================================>] 100% with 0 failures
 Completed [========================================================================] 100% with 0 failures
                                                                                                          

Done!
gd1_markers <- gd1_markers[gd1_markers$p_val_adj < 0.05, ]
head(gd1_markers, n = 15)
gd1_markers_annotated <- merge(gene_annotations, gd1_markers, by.x = "Gene.ID", by.y = 0)
View(gd1_markers_annotated)

fd1

cells.8 <- subset(tenx.mutant.integrated.sex, idents = "8")
DefaultAssay(cells.8) <- "RNA"
Idents(cells.8) <- "identity_combined"
fd1_markers <- FindMarkers(cells.8, ident.1 = "fd1", ident.2 = c("wild-type (10x)", "wild-type (Smart-seq2)"), test.use = "MAST", verbose = FALSE)
Assuming data assay in position 1, with name et is log-transformed.

 Completed [>-----------------------------------------------------------------------]   1% with 0 failures
 Completed [>-----------------------------------------------------------------------]   2% with 0 failures
 Completed [=>----------------------------------------------------------------------]   2% with 0 failures
 Completed [=>----------------------------------------------------------------------]   3% with 0 failures
 Completed [==>---------------------------------------------------------------------]   3% with 0 failures
 Completed [==>---------------------------------------------------------------------]   4% with 0 failures
 Completed [==>---------------------------------------------------------------------]   5% with 0 failures
 Completed [===>--------------------------------------------------------------------]   5% with 0 failures
 Completed [===>--------------------------------------------------------------------]   6% with 0 failures
 Completed [====>-------------------------------------------------------------------]   6% with 0 failures
 Completed [====>-------------------------------------------------------------------]   7% with 0 failures
 Completed [====>-------------------------------------------------------------------]   8% with 0 failures
 Completed [=====>------------------------------------------------------------------]   8% with 0 failures
 Completed [=====>------------------------------------------------------------------]   9% with 0 failures
 Completed [======>-----------------------------------------------------------------]   9% with 0 failures
 Completed [======>-----------------------------------------------------------------]  10% with 0 failures
 Completed [=======>----------------------------------------------------------------]  10% with 0 failures
 Completed [=======>----------------------------------------------------------------]  11% with 0 failures
 Completed [=======>----------------------------------------------------------------]  12% with 0 failures
 Completed [========>---------------------------------------------------------------]  12% with 0 failures
 Completed [========>---------------------------------------------------------------]  13% with 0 failures
 Completed [=========>--------------------------------------------------------------]  13% with 0 failures
 Completed [=========>--------------------------------------------------------------]  14% with 0 failures
 Completed [=========>--------------------------------------------------------------]  15% with 0 failures
 Completed [==========>-------------------------------------------------------------]  15% with 0 failures
 Completed [==========>-------------------------------------------------------------]  16% with 0 failures
 Completed [===========>------------------------------------------------------------]  16% with 0 failures
 Completed [===========>------------------------------------------------------------]  17% with 0 failures
 Completed [============>-----------------------------------------------------------]  17% with 0 failures
 Completed [============>-----------------------------------------------------------]  18% with 0 failures
 Completed [============>-----------------------------------------------------------]  19% with 0 failures
 Completed [=============>----------------------------------------------------------]  19% with 0 failures
 Completed [=============>----------------------------------------------------------]  20% with 0 failures
 Completed [==============>---------------------------------------------------------]  20% with 0 failures
 Completed [==============>---------------------------------------------------------]  21% with 0 failures
 Completed [==============>---------------------------------------------------------]  22% with 0 failures
 Completed [===============>--------------------------------------------------------]  22% with 0 failures
 Completed [===============>--------------------------------------------------------]  23% with 0 failures
 Completed [================>-------------------------------------------------------]  23% with 0 failures
 Completed [================>-------------------------------------------------------]  24% with 0 failures
 Completed [=================>------------------------------------------------------]  24% with 0 failures
 Completed [=================>------------------------------------------------------]  25% with 0 failures
 Completed [=================>------------------------------------------------------]  26% with 0 failures
 Completed [==================>-----------------------------------------------------]  26% with 0 failures
 Completed [==================>-----------------------------------------------------]  27% with 0 failures
 Completed [===================>----------------------------------------------------]  27% with 0 failures
 Completed [===================>----------------------------------------------------]  28% with 0 failures
 Completed [====================>---------------------------------------------------]  28% with 0 failures
 Completed [====================>---------------------------------------------------]  29% with 0 failures
 Completed [====================>---------------------------------------------------]  30% with 0 failures
 Completed [=====================>--------------------------------------------------]  30% with 0 failures
 Completed [=====================>--------------------------------------------------]  31% with 0 failures
 Completed [======================>-------------------------------------------------]  31% with 0 failures
 Completed [======================>-------------------------------------------------]  32% with 0 failures
 Completed [======================>-------------------------------------------------]  33% with 0 failures
 Completed [=======================>------------------------------------------------]  33% with 0 failures
 Completed [=======================>------------------------------------------------]  34% with 0 failures
 Completed [========================>-----------------------------------------------]  34% with 0 failures
 Completed [========================>-----------------------------------------------]  35% with 0 failures
 Completed [=========================>----------------------------------------------]  35% with 0 failures
 Completed [=========================>----------------------------------------------]  36% with 0 failures
 Completed [=========================>----------------------------------------------]  37% with 0 failures
 Completed [==========================>---------------------------------------------]  37% with 0 failures
 Completed [==========================>---------------------------------------------]  38% with 0 failures
 Completed [===========================>--------------------------------------------]  38% with 0 failures
 Completed [===========================>--------------------------------------------]  39% with 0 failures
 Completed [===========================>--------------------------------------------]  40% with 0 failures
 Completed [============================>-------------------------------------------]  40% with 0 failures
 Completed [============================>-------------------------------------------]  41% with 0 failures
 Completed [=============================>------------------------------------------]  41% with 0 failures
 Completed [=============================>------------------------------------------]  42% with 0 failures
 Completed [==============================>-----------------------------------------]  42% with 0 failures
 Completed [==============================>-----------------------------------------]  43% with 0 failures
 Completed [==============================>-----------------------------------------]  44% with 0 failures
 Completed [===============================>----------------------------------------]  44% with 0 failures
 Completed [===============================>----------------------------------------]  45% with 0 failures
 Completed [================================>---------------------------------------]  45% with 0 failures
 Completed [================================>---------------------------------------]  46% with 0 failures
 Completed [================================>---------------------------------------]  47% with 0 failures
 Completed [=================================>--------------------------------------]  47% with 0 failures
 Completed [=================================>--------------------------------------]  48% with 0 failures
 Completed [==================================>-------------------------------------]  48% with 0 failures
 Completed [==================================>-------------------------------------]  49% with 0 failures
 Completed [===================================>------------------------------------]  49% with 0 failures
 Completed [===================================>------------------------------------]  50% with 0 failures
 Completed [===================================>------------------------------------]  51% with 0 failures
 Completed [====================================>-----------------------------------]  51% with 0 failures
 Completed [====================================>-----------------------------------]  52% with 0 failures
 Completed [=====================================>----------------------------------]  52% with 0 failures
 Completed [=====================================>----------------------------------]  53% with 0 failures
 Completed [======================================>---------------------------------]  53% with 0 failures
 Completed [======================================>---------------------------------]  54% with 0 failures
 Completed [======================================>---------------------------------]  55% with 0 failures
 Completed [=======================================>--------------------------------]  55% with 0 failures
 Completed [=======================================>--------------------------------]  56% with 0 failures
 Completed [========================================>-------------------------------]  56% with 0 failures
 Completed [========================================>-------------------------------]  57% with 0 failures
 Completed [========================================>-------------------------------]  58% with 0 failures
 Completed [=========================================>------------------------------]  58% with 0 failures
 Completed [=========================================>------------------------------]  59% with 0 failures
 Completed [==========================================>-----------------------------]  59% with 0 failures
 Completed [==========================================>-----------------------------]  60% with 0 failures
 Completed [===========================================>----------------------------]  60% with 0 failures
 Completed [===========================================>----------------------------]  61% with 0 failures
 Completed [===========================================>----------------------------]  62% with 0 failures
 Completed [============================================>---------------------------]  62% with 0 failures
 Completed [============================================>---------------------------]  63% with 0 failures
 Completed [=============================================>--------------------------]  63% with 0 failures
 Completed [=============================================>--------------------------]  64% with 0 failures
 Completed [=============================================>--------------------------]  65% with 0 failures
 Completed [==============================================>-------------------------]  65% with 0 failures
 Completed [==============================================>-------------------------]  66% with 0 failures
 Completed [===============================================>------------------------]  66% with 0 failures
 Completed [===============================================>------------------------]  67% with 0 failures
 Completed [================================================>-----------------------]  67% with 0 failures
 Completed [================================================>-----------------------]  68% with 0 failures
 Completed [================================================>-----------------------]  69% with 0 failures
 Completed [=================================================>----------------------]  69% with 0 failures
 Completed [=================================================>----------------------]  70% with 0 failures
 Completed [==================================================>---------------------]  70% with 0 failures
 Completed [==================================================>---------------------]  71% with 0 failures
 Completed [==================================================>---------------------]  72% with 0 failures
 Completed [===================================================>--------------------]  72% with 0 failures
 Completed [===================================================>--------------------]  73% with 0 failures
 Completed [====================================================>-------------------]  73% with 0 failures
 Completed [====================================================>-------------------]  74% with 0 failures
 Completed [=====================================================>------------------]  74% with 0 failures
 Completed [=====================================================>------------------]  75% with 0 failures
 Completed [=====================================================>------------------]  76% with 0 failures
 Completed [======================================================>-----------------]  76% with 0 failures
 Completed [======================================================>-----------------]  77% with 0 failures
 Completed [=======================================================>----------------]  77% with 0 failures
 Completed [=======================================================>----------------]  78% with 0 failures
 Completed [========================================================>---------------]  78% with 0 failures
 Completed [========================================================>---------------]  79% with 0 failures
 Completed [========================================================>---------------]  80% with 0 failures
 Completed [=========================================================>--------------]  80% with 0 failures
 Completed [=========================================================>--------------]  81% with 0 failures
 Completed [==========================================================>-------------]  81% with 0 failures
 Completed [==========================================================>-------------]  82% with 0 failures
 Completed [==========================================================>-------------]  83% with 0 failures
 Completed [===========================================================>------------]  83% with 0 failures
 Completed [===========================================================>------------]  84% with 0 failures
 Completed [============================================================>-----------]  84% with 0 failures
 Completed [============================================================>-----------]  85% with 0 failures
 Completed [=============================================================>----------]  85% with 0 failures
 Completed [=============================================================>----------]  86% with 0 failures
 Completed [=============================================================>----------]  87% with 0 failures
 Completed [==============================================================>---------]  87% with 0 failures
 Completed [==============================================================>---------]  88% with 0 failures
 Completed [===============================================================>--------]  88% with 0 failures
 Completed [===============================================================>--------]  89% with 0 failures
 Completed [===============================================================>--------]  90% with 0 failures
 Completed [================================================================>-------]  90% with 0 failures
 Completed [================================================================>-------]  91% with 0 failures
 Completed [=================================================================>------]  91% with 0 failures
 Completed [=================================================================>------]  92% with 0 failures
 Completed [==================================================================>-----]  92% with 0 failures
 Completed [==================================================================>-----]  93% with 0 failures
 Completed [==================================================================>-----]  94% with 0 failures
 Completed [===================================================================>----]  94% with 0 failures
 Completed [===================================================================>----]  95% with 0 failures
 Completed [====================================================================>---]  95% with 0 failures
 Completed [====================================================================>---]  96% with 0 failures
 Completed [====================================================================>---]  97% with 0 failures
 Completed [=====================================================================>--]  97% with 0 failures
 Completed [=====================================================================>--]  98% with 0 failures
 Completed [======================================================================>-]  98% with 0 failures
 Completed [======================================================================>-]  99% with 0 failures
 Completed [=======================================================================>]  99% with 0 failures
 Completed [=======================================================================>] 100% with 0 failures
 Completed [========================================================================] 100% with 0 failures
                                                                                                          

Done!
Combining coefficients and standard errors
Calculating log-fold changes
Calculating likelihood ratio tests
Refitting on reduced model...

 Completed [>-----------------------------------------------------------------------]   2% with 0 failures
 Completed [=>----------------------------------------------------------------------]   2% with 0 failures
 Completed [=>----------------------------------------------------------------------]   3% with 0 failures
 Completed [==>---------------------------------------------------------------------]   3% with 0 failures
 Completed [==>---------------------------------------------------------------------]   4% with 0 failures
 Completed [==>---------------------------------------------------------------------]   5% with 0 failures
 Completed [===>--------------------------------------------------------------------]   5% with 0 failures
 Completed [===>--------------------------------------------------------------------]   6% with 0 failures
 Completed [====>-------------------------------------------------------------------]   6% with 0 failures
 Completed [====>-------------------------------------------------------------------]   7% with 0 failures
 Completed [====>-------------------------------------------------------------------]   8% with 0 failures
 Completed [=====>------------------------------------------------------------------]   8% with 0 failures
 Completed [=====>------------------------------------------------------------------]   9% with 0 failures
 Completed [======>-----------------------------------------------------------------]   9% with 0 failures
 Completed [======>-----------------------------------------------------------------]  10% with 0 failures
 Completed [=======>----------------------------------------------------------------]  10% with 0 failures
 Completed [=======>----------------------------------------------------------------]  11% with 0 failures
 Completed [=======>----------------------------------------------------------------]  12% with 0 failures
 Completed [========>---------------------------------------------------------------]  12% with 0 failures
 Completed [========>---------------------------------------------------------------]  13% with 0 failures
 Completed [=========>--------------------------------------------------------------]  13% with 0 failures
 Completed [=========>--------------------------------------------------------------]  14% with 0 failures
 Completed [=========>--------------------------------------------------------------]  15% with 0 failures
 Completed [==========>-------------------------------------------------------------]  15% with 0 failures
 Completed [==========>-------------------------------------------------------------]  16% with 0 failures
 Completed [===========>------------------------------------------------------------]  16% with 0 failures
 Completed [===========>------------------------------------------------------------]  17% with 0 failures
 Completed [============>-----------------------------------------------------------]  17% with 0 failures
 Completed [============>-----------------------------------------------------------]  18% with 0 failures
 Completed [============>-----------------------------------------------------------]  19% with 0 failures
 Completed [=============>----------------------------------------------------------]  19% with 0 failures
 Completed [=============>----------------------------------------------------------]  20% with 0 failures
 Completed [==============>---------------------------------------------------------]  20% with 0 failures
 Completed [==============>---------------------------------------------------------]  21% with 0 failures
 Completed [==============>---------------------------------------------------------]  22% with 0 failures
 Completed [===============>--------------------------------------------------------]  22% with 0 failures
 Completed [===============>--------------------------------------------------------]  23% with 0 failures
 Completed [================>-------------------------------------------------------]  23% with 0 failures
 Completed [================>-------------------------------------------------------]  24% with 0 failures
 Completed [=================>------------------------------------------------------]  24% with 0 failures
 Completed [=================>------------------------------------------------------]  25% with 0 failures
 Completed [=================>------------------------------------------------------]  26% with 0 failures
 Completed [==================>-----------------------------------------------------]  26% with 0 failures
 Completed [==================>-----------------------------------------------------]  27% with 0 failures
 Completed [===================>----------------------------------------------------]  27% with 0 failures
 Completed [===================>----------------------------------------------------]  28% with 0 failures
 Completed [====================>---------------------------------------------------]  28% with 0 failures
 Completed [====================>---------------------------------------------------]  29% with 0 failures
 Completed [====================>---------------------------------------------------]  30% with 0 failures
 Completed [=====================>--------------------------------------------------]  30% with 0 failures
 Completed [=====================>--------------------------------------------------]  31% with 0 failures
 Completed [======================>-------------------------------------------------]  31% with 0 failures
 Completed [======================>-------------------------------------------------]  32% with 0 failures
 Completed [======================>-------------------------------------------------]  33% with 0 failures
 Completed [=======================>------------------------------------------------]  33% with 0 failures
 Completed [=======================>------------------------------------------------]  34% with 0 failures
 Completed [========================>-----------------------------------------------]  34% with 0 failures
 Completed [========================>-----------------------------------------------]  35% with 0 failures
 Completed [=========================>----------------------------------------------]  35% with 0 failures
 Completed [=========================>----------------------------------------------]  36% with 0 failures
 Completed [=========================>----------------------------------------------]  37% with 0 failures
 Completed [==========================>---------------------------------------------]  37% with 0 failures
 Completed [==========================>---------------------------------------------]  38% with 0 failures
 Completed [===========================>--------------------------------------------]  38% with 0 failures
 Completed [===========================>--------------------------------------------]  39% with 0 failures
 Completed [===========================>--------------------------------------------]  40% with 0 failures
 Completed [============================>-------------------------------------------]  40% with 0 failures
 Completed [============================>-------------------------------------------]  41% with 0 failures
 Completed [=============================>------------------------------------------]  41% with 0 failures
 Completed [=============================>------------------------------------------]  42% with 0 failures
 Completed [==============================>-----------------------------------------]  42% with 0 failures
 Completed [==============================>-----------------------------------------]  43% with 0 failures
 Completed [==============================>-----------------------------------------]  44% with 0 failures
 Completed [===============================>----------------------------------------]  44% with 0 failures
 Completed [===============================>----------------------------------------]  45% with 0 failures
 Completed [================================>---------------------------------------]  45% with 0 failures
 Completed [================================>---------------------------------------]  46% with 0 failures
 Completed [================================>---------------------------------------]  47% with 0 failures
 Completed [=================================>--------------------------------------]  47% with 0 failures
 Completed [=================================>--------------------------------------]  48% with 0 failures
 Completed [==================================>-------------------------------------]  48% with 0 failures
 Completed [==================================>-------------------------------------]  49% with 0 failures
 Completed [===================================>------------------------------------]  49% with 0 failures
 Completed [===================================>------------------------------------]  50% with 0 failures
 Completed [===================================>------------------------------------]  51% with 0 failures
 Completed [====================================>-----------------------------------]  51% with 0 failures
 Completed [====================================>-----------------------------------]  52% with 0 failures
 Completed [=====================================>----------------------------------]  52% with 0 failures
 Completed [=====================================>----------------------------------]  53% with 0 failures
 Completed [======================================>---------------------------------]  53% with 0 failures
 Completed [======================================>---------------------------------]  54% with 0 failures
 Completed [======================================>---------------------------------]  55% with 0 failures
 Completed [=======================================>--------------------------------]  55% with 0 failures
 Completed [=======================================>--------------------------------]  56% with 0 failures
 Completed [========================================>-------------------------------]  56% with 0 failures
 Completed [========================================>-------------------------------]  57% with 0 failures
 Completed [========================================>-------------------------------]  58% with 0 failures
 Completed [=========================================>------------------------------]  58% with 0 failures
 Completed [=========================================>------------------------------]  59% with 0 failures
 Completed [==========================================>-----------------------------]  59% with 0 failures
 Completed [==========================================>-----------------------------]  60% with 0 failures
 Completed [===========================================>----------------------------]  60% with 0 failures
 Completed [===========================================>----------------------------]  61% with 0 failures
 Completed [===========================================>----------------------------]  62% with 0 failures
 Completed [============================================>---------------------------]  62% with 0 failures
 Completed [============================================>---------------------------]  63% with 0 failures
 Completed [=============================================>--------------------------]  63% with 0 failures
 Completed [=============================================>--------------------------]  64% with 0 failures
 Completed [=============================================>--------------------------]  65% with 0 failures
 Completed [==============================================>-------------------------]  65% with 0 failures
 Completed [==============================================>-------------------------]  66% with 0 failures
 Completed [===============================================>------------------------]  66% with 0 failures
 Completed [===============================================>------------------------]  67% with 0 failures
 Completed [================================================>-----------------------]  67% with 0 failures
 Completed [================================================>-----------------------]  68% with 0 failures
 Completed [================================================>-----------------------]  69% with 0 failures
 Completed [=================================================>----------------------]  69% with 0 failures
 Completed [=================================================>----------------------]  70% with 0 failures
 Completed [==================================================>---------------------]  70% with 0 failures
 Completed [==================================================>---------------------]  71% with 0 failures
 Completed [==================================================>---------------------]  72% with 0 failures
 Completed [===================================================>--------------------]  72% with 0 failures
 Completed [===================================================>--------------------]  73% with 0 failures
 Completed [====================================================>-------------------]  73% with 0 failures
 Completed [====================================================>-------------------]  74% with 0 failures
 Completed [=====================================================>------------------]  74% with 0 failures
 Completed [=====================================================>------------------]  75% with 0 failures
 Completed [=====================================================>------------------]  76% with 0 failures
 Completed [======================================================>-----------------]  76% with 0 failures
 Completed [======================================================>-----------------]  77% with 0 failures
 Completed [=======================================================>----------------]  77% with 0 failures
 Completed [=======================================================>----------------]  78% with 0 failures
 Completed [========================================================>---------------]  78% with 0 failures
 Completed [========================================================>---------------]  79% with 0 failures
 Completed [========================================================>---------------]  80% with 0 failures
 Completed [=========================================================>--------------]  80% with 0 failures
 Completed [=========================================================>--------------]  81% with 0 failures
 Completed [==========================================================>-------------]  81% with 0 failures
 Completed [==========================================================>-------------]  82% with 0 failures
 Completed [==========================================================>-------------]  83% with 0 failures
 Completed [===========================================================>------------]  83% with 0 failures
 Completed [===========================================================>------------]  84% with 0 failures
 Completed [============================================================>-----------]  84% with 0 failures
 Completed [============================================================>-----------]  85% with 0 failures
 Completed [=============================================================>----------]  85% with 0 failures
 Completed [=============================================================>----------]  86% with 0 failures
 Completed [=============================================================>----------]  87% with 0 failures
 Completed [==============================================================>---------]  87% with 0 failures
 Completed [==============================================================>---------]  88% with 0 failures
 Completed [===============================================================>--------]  88% with 0 failures
 Completed [===============================================================>--------]  89% with 0 failures
 Completed [===============================================================>--------]  90% with 0 failures
 Completed [================================================================>-------]  90% with 0 failures
 Completed [================================================================>-------]  91% with 0 failures
 Completed [=================================================================>------]  91% with 0 failures
 Completed [=================================================================>------]  92% with 0 failures
 Completed [==================================================================>-----]  92% with 0 failures
 Completed [==================================================================>-----]  93% with 0 failures
 Completed [==================================================================>-----]  94% with 0 failures
 Completed [===================================================================>----]  94% with 0 failures
 Completed [===================================================================>----]  95% with 0 failures
 Completed [====================================================================>---]  95% with 0 failures
 Completed [====================================================================>---]  96% with 0 failures
 Completed [====================================================================>---]  97% with 0 failures
 Completed [=====================================================================>--]  97% with 0 failures
 Completed [=====================================================================>--]  98% with 0 failures
 Completed [======================================================================>-]  98% with 0 failures
 Completed [======================================================================>-]  99% with 0 failures
 Completed [=======================================================================>]  99% with 0 failures
 Completed [=======================================================================>] 100% with 0 failures
 Completed [========================================================================] 100% with 0 failures
                                                                                                          

Done!
fd1_markers <- fd1_markers[fd1_markers$p_val_adj < 0.05, ]
head(fd1_markers, n = 15)
fd1_markers_annotated <- merge(gene_annotations, fd1_markers, by.x = "Gene.ID", by.y = 0)
View(fd1_markers_annotated)

fd2

cells.15.8 <- subset(tenx.mutant.integrated.sex, idents = c("15", "8"))
DefaultAssay(cells.15.8) <- "RNA"
Idents(cells.15.8) <- "identity_combined"
fd2_markers <- FindMarkers(cells.15.8, ident.1 = "fd2", ident.2 = c("wild-type (10x)", "wild-type (Smart-seq2)"), test.use = "MAST", verbose = FALSE)
Assuming data assay in position 1, with name et is log-transformed.

 Completed [>-----------------------------------------------------------------------]   1% with 0 failures
 Completed [>-----------------------------------------------------------------------]   2% with 0 failures
 Completed [=>----------------------------------------------------------------------]   2% with 0 failures
 Completed [=>----------------------------------------------------------------------]   3% with 0 failures
 Completed [==>---------------------------------------------------------------------]   3% with 0 failures
 Completed [==>---------------------------------------------------------------------]   4% with 0 failures
 Completed [==>---------------------------------------------------------------------]   5% with 0 failures
 Completed [===>--------------------------------------------------------------------]   5% with 0 failures
 Completed [===>--------------------------------------------------------------------]   6% with 0 failures
 Completed [====>-------------------------------------------------------------------]   6% with 0 failures
 Completed [====>-------------------------------------------------------------------]   7% with 0 failures
 Completed [====>-------------------------------------------------------------------]   8% with 0 failures
 Completed [=====>------------------------------------------------------------------]   8% with 0 failures
 Completed [=====>------------------------------------------------------------------]   9% with 0 failures
 Completed [======>-----------------------------------------------------------------]   9% with 0 failures
 Completed [======>-----------------------------------------------------------------]  10% with 0 failures
 Completed [=======>----------------------------------------------------------------]  10% with 0 failures
 Completed [=======>----------------------------------------------------------------]  11% with 0 failures
 Completed [=======>----------------------------------------------------------------]  12% with 0 failures
 Completed [========>---------------------------------------------------------------]  12% with 0 failures
 Completed [========>---------------------------------------------------------------]  13% with 0 failures
 Completed [=========>--------------------------------------------------------------]  13% with 0 failures
 Completed [=========>--------------------------------------------------------------]  14% with 0 failures
 Completed [=========>--------------------------------------------------------------]  15% with 0 failures
 Completed [==========>-------------------------------------------------------------]  15% with 0 failures
 Completed [==========>-------------------------------------------------------------]  16% with 0 failures
 Completed [===========>------------------------------------------------------------]  16% with 0 failures
 Completed [===========>------------------------------------------------------------]  17% with 0 failures
 Completed [============>-----------------------------------------------------------]  17% with 0 failures
 Completed [============>-----------------------------------------------------------]  18% with 0 failures
 Completed [============>-----------------------------------------------------------]  19% with 0 failures
 Completed [=============>----------------------------------------------------------]  19% with 0 failures
 Completed [=============>----------------------------------------------------------]  20% with 0 failures
 Completed [==============>---------------------------------------------------------]  20% with 0 failures
 Completed [==============>---------------------------------------------------------]  21% with 0 failures
 Completed [==============>---------------------------------------------------------]  22% with 0 failures
 Completed [===============>--------------------------------------------------------]  22% with 0 failures
 Completed [===============>--------------------------------------------------------]  23% with 0 failures
 Completed [================>-------------------------------------------------------]  23% with 0 failures
 Completed [================>-------------------------------------------------------]  24% with 0 failures
 Completed [=================>------------------------------------------------------]  24% with 0 failures
 Completed [=================>------------------------------------------------------]  25% with 0 failures
 Completed [=================>------------------------------------------------------]  26% with 0 failures
 Completed [==================>-----------------------------------------------------]  26% with 0 failures
 Completed [==================>-----------------------------------------------------]  27% with 0 failures
 Completed [===================>----------------------------------------------------]  27% with 0 failures
 Completed [===================>----------------------------------------------------]  28% with 0 failures
 Completed [====================>---------------------------------------------------]  28% with 0 failures
 Completed [====================>---------------------------------------------------]  29% with 0 failures
 Completed [====================>---------------------------------------------------]  30% with 0 failures
 Completed [=====================>--------------------------------------------------]  30% with 0 failures
 Completed [=====================>--------------------------------------------------]  31% with 0 failures
 Completed [======================>-------------------------------------------------]  31% with 0 failures
 Completed [======================>-------------------------------------------------]  32% with 0 failures
 Completed [======================>-------------------------------------------------]  33% with 0 failures
 Completed [=======================>------------------------------------------------]  33% with 0 failures
 Completed [=======================>------------------------------------------------]  34% with 0 failures
 Completed [========================>-----------------------------------------------]  34% with 0 failures
 Completed [========================>-----------------------------------------------]  35% with 0 failures
 Completed [=========================>----------------------------------------------]  35% with 0 failures
 Completed [=========================>----------------------------------------------]  36% with 0 failures
 Completed [=========================>----------------------------------------------]  37% with 0 failures
 Completed [==========================>---------------------------------------------]  37% with 0 failures
 Completed [==========================>---------------------------------------------]  38% with 0 failures
 Completed [===========================>--------------------------------------------]  38% with 0 failures
 Completed [===========================>--------------------------------------------]  39% with 0 failures
 Completed [===========================>--------------------------------------------]  40% with 0 failures
 Completed [============================>-------------------------------------------]  40% with 0 failures
 Completed [============================>-------------------------------------------]  41% with 0 failures
 Completed [=============================>------------------------------------------]  41% with 0 failures
 Completed [=============================>------------------------------------------]  42% with 0 failures
 Completed [==============================>-----------------------------------------]  42% with 0 failures
 Completed [==============================>-----------------------------------------]  43% with 0 failures
 Completed [==============================>-----------------------------------------]  44% with 0 failures
 Completed [===============================>----------------------------------------]  44% with 0 failures
 Completed [===============================>----------------------------------------]  45% with 0 failures
 Completed [================================>---------------------------------------]  45% with 0 failures
 Completed [================================>---------------------------------------]  46% with 0 failures
 Completed [================================>---------------------------------------]  47% with 0 failures
 Completed [=================================>--------------------------------------]  47% with 0 failures
 Completed [=================================>--------------------------------------]  48% with 0 failures
 Completed [==================================>-------------------------------------]  48% with 0 failures
 Completed [==================================>-------------------------------------]  49% with 0 failures
 Completed [===================================>------------------------------------]  49% with 0 failures
 Completed [===================================>------------------------------------]  50% with 0 failures
 Completed [===================================>------------------------------------]  51% with 0 failures
 Completed [====================================>-----------------------------------]  51% with 0 failures
 Completed [====================================>-----------------------------------]  52% with 0 failures
 Completed [=====================================>----------------------------------]  52% with 0 failures
 Completed [=====================================>----------------------------------]  53% with 0 failures
 Completed [======================================>---------------------------------]  53% with 0 failures
 Completed [======================================>---------------------------------]  54% with 0 failures
 Completed [======================================>---------------------------------]  55% with 0 failures
 Completed [=======================================>--------------------------------]  55% with 0 failures
 Completed [=======================================>--------------------------------]  56% with 0 failures
 Completed [========================================>-------------------------------]  56% with 0 failures
 Completed [========================================>-------------------------------]  57% with 0 failures
 Completed [========================================>-------------------------------]  58% with 0 failures
 Completed [=========================================>------------------------------]  58% with 0 failures
 Completed [=========================================>------------------------------]  59% with 0 failures
 Completed [==========================================>-----------------------------]  59% with 0 failures
 Completed [==========================================>-----------------------------]  60% with 0 failures
 Completed [===========================================>----------------------------]  60% with 0 failures
 Completed [===========================================>----------------------------]  61% with 0 failures
 Completed [===========================================>----------------------------]  62% with 0 failures
 Completed [============================================>---------------------------]  62% with 0 failures
 Completed [============================================>---------------------------]  63% with 0 failures
 Completed [=============================================>--------------------------]  63% with 0 failures
 Completed [=============================================>--------------------------]  64% with 0 failures
 Completed [=============================================>--------------------------]  65% with 0 failures
 Completed [==============================================>-------------------------]  65% with 0 failures
 Completed [==============================================>-------------------------]  66% with 0 failures
 Completed [===============================================>------------------------]  66% with 0 failures
 Completed [===============================================>------------------------]  67% with 0 failures
 Completed [================================================>-----------------------]  67% with 0 failures
 Completed [================================================>-----------------------]  68% with 0 failures
 Completed [================================================>-----------------------]  69% with 0 failures
 Completed [=================================================>----------------------]  69% with 0 failures
 Completed [=================================================>----------------------]  70% with 0 failures
 Completed [==================================================>---------------------]  70% with 0 failures
 Completed [==================================================>---------------------]  71% with 0 failures
 Completed [==================================================>---------------------]  72% with 0 failures
 Completed [===================================================>--------------------]  72% with 0 failures
 Completed [===================================================>--------------------]  73% with 0 failures
 Completed [====================================================>-------------------]  73% with 0 failures
 Completed [====================================================>-------------------]  74% with 0 failures
 Completed [=====================================================>------------------]  74% with 0 failures
 Completed [=====================================================>------------------]  75% with 0 failures
 Completed [=====================================================>------------------]  76% with 0 failures
 Completed [======================================================>-----------------]  76% with 0 failures
 Completed [======================================================>-----------------]  77% with 0 failures
 Completed [=======================================================>----------------]  77% with 0 failures
 Completed [=======================================================>----------------]  78% with 0 failures
 Completed [========================================================>---------------]  78% with 0 failures
 Completed [========================================================>---------------]  79% with 0 failures
 Completed [========================================================>---------------]  80% with 0 failures
 Completed [=========================================================>--------------]  80% with 0 failures
 Completed [=========================================================>--------------]  81% with 0 failures
 Completed [==========================================================>-------------]  81% with 0 failures
 Completed [==========================================================>-------------]  82% with 0 failures
 Completed [==========================================================>-------------]  83% with 0 failures
 Completed [===========================================================>------------]  83% with 0 failures
 Completed [===========================================================>------------]  84% with 0 failures
 Completed [============================================================>-----------]  84% with 0 failures
 Completed [============================================================>-----------]  85% with 0 failures
 Completed [=============================================================>----------]  85% with 0 failures
 Completed [=============================================================>----------]  86% with 0 failures
 Completed [=============================================================>----------]  87% with 0 failures
 Completed [==============================================================>---------]  87% with 0 failures
 Completed [==============================================================>---------]  88% with 0 failures
 Completed [===============================================================>--------]  88% with 0 failures
 Completed [===============================================================>--------]  89% with 0 failures
 Completed [===============================================================>--------]  90% with 0 failures
 Completed [================================================================>-------]  90% with 0 failures
 Completed [================================================================>-------]  91% with 0 failures
 Completed [=================================================================>------]  91% with 0 failures
 Completed [=================================================================>------]  92% with 0 failures
 Completed [==================================================================>-----]  92% with 0 failures
 Completed [==================================================================>-----]  93% with 0 failures
 Completed [==================================================================>-----]  94% with 0 failures
 Completed [===================================================================>----]  94% with 0 failures
 Completed [===================================================================>----]  95% with 0 failures
 Completed [====================================================================>---]  95% with 0 failures
 Completed [====================================================================>---]  96% with 0 failures
 Completed [====================================================================>---]  97% with 0 failures
 Completed [=====================================================================>--]  97% with 0 failures
 Completed [=====================================================================>--]  98% with 0 failures
 Completed [======================================================================>-]  98% with 0 failures
 Completed [======================================================================>-]  99% with 0 failures
 Completed [=======================================================================>]  99% with 0 failures
 Completed [=======================================================================>] 100% with 0 failures
 Completed [========================================================================] 100% with 0 failures
                                                                                                          

Done!
Combining coefficients and standard errors
Calculating log-fold changes
Calculating likelihood ratio tests
Refitting on reduced model...

 Completed [=>----------------------------------------------------------------------]   2% with 0 failures
 Completed [=>----------------------------------------------------------------------]   3% with 0 failures
 Completed [==>---------------------------------------------------------------------]   3% with 0 failures
 Completed [==>---------------------------------------------------------------------]   4% with 0 failures
 Completed [==>---------------------------------------------------------------------]   5% with 0 failures
 Completed [===>--------------------------------------------------------------------]   5% with 0 failures
 Completed [===>--------------------------------------------------------------------]   6% with 0 failures
 Completed [====>-------------------------------------------------------------------]   6% with 0 failures
 Completed [====>-------------------------------------------------------------------]   7% with 0 failures
 Completed [====>-------------------------------------------------------------------]   8% with 0 failures
 Completed [=====>------------------------------------------------------------------]   8% with 0 failures
 Completed [=====>------------------------------------------------------------------]   9% with 0 failures
 Completed [======>-----------------------------------------------------------------]   9% with 0 failures
 Completed [======>-----------------------------------------------------------------]  10% with 0 failures
 Completed [=======>----------------------------------------------------------------]  10% with 0 failures
 Completed [=======>----------------------------------------------------------------]  11% with 0 failures
 Completed [=======>----------------------------------------------------------------]  12% with 0 failures
 Completed [========>---------------------------------------------------------------]  12% with 0 failures
 Completed [========>---------------------------------------------------------------]  13% with 0 failures
 Completed [=========>--------------------------------------------------------------]  13% with 0 failures
 Completed [=========>--------------------------------------------------------------]  14% with 0 failures
 Completed [=========>--------------------------------------------------------------]  15% with 0 failures
 Completed [==========>-------------------------------------------------------------]  15% with 0 failures
 Completed [==========>-------------------------------------------------------------]  16% with 0 failures
 Completed [===========>------------------------------------------------------------]  16% with 0 failures
 Completed [===========>------------------------------------------------------------]  17% with 0 failures
 Completed [============>-----------------------------------------------------------]  17% with 0 failures
 Completed [============>-----------------------------------------------------------]  18% with 0 failures
 Completed [============>-----------------------------------------------------------]  19% with 0 failures
 Completed [=============>----------------------------------------------------------]  19% with 0 failures
 Completed [=============>----------------------------------------------------------]  20% with 0 failures
 Completed [==============>---------------------------------------------------------]  20% with 0 failures
 Completed [==============>---------------------------------------------------------]  21% with 0 failures
 Completed [==============>---------------------------------------------------------]  22% with 0 failures
 Completed [===============>--------------------------------------------------------]  22% with 0 failures
 Completed [===============>--------------------------------------------------------]  23% with 0 failures
 Completed [================>-------------------------------------------------------]  23% with 0 failures
 Completed [================>-------------------------------------------------------]  24% with 0 failures
 Completed [=================>------------------------------------------------------]  24% with 0 failures
 Completed [=================>------------------------------------------------------]  25% with 0 failures
 Completed [=================>------------------------------------------------------]  26% with 0 failures
 Completed [==================>-----------------------------------------------------]  26% with 0 failures
 Completed [==================>-----------------------------------------------------]  27% with 0 failures
 Completed [===================>----------------------------------------------------]  27% with 0 failures
 Completed [===================>----------------------------------------------------]  28% with 0 failures
 Completed [====================>---------------------------------------------------]  28% with 0 failures
 Completed [====================>---------------------------------------------------]  29% with 0 failures
 Completed [====================>---------------------------------------------------]  30% with 0 failures
 Completed [=====================>--------------------------------------------------]  30% with 0 failures
 Completed [=====================>--------------------------------------------------]  31% with 0 failures
 Completed [======================>-------------------------------------------------]  31% with 0 failures
 Completed [======================>-------------------------------------------------]  32% with 0 failures
 Completed [======================>-------------------------------------------------]  33% with 0 failures
 Completed [=======================>------------------------------------------------]  33% with 0 failures
 Completed [=======================>------------------------------------------------]  34% with 0 failures
 Completed [========================>-----------------------------------------------]  34% with 0 failures
 Completed [========================>-----------------------------------------------]  35% with 0 failures
 Completed [=========================>----------------------------------------------]  35% with 0 failures
 Completed [=========================>----------------------------------------------]  36% with 0 failures
 Completed [=========================>----------------------------------------------]  37% with 0 failures
 Completed [==========================>---------------------------------------------]  37% with 0 failures
 Completed [==========================>---------------------------------------------]  38% with 0 failures
 Completed [===========================>--------------------------------------------]  38% with 0 failures
 Completed [===========================>--------------------------------------------]  39% with 0 failures
 Completed [===========================>--------------------------------------------]  40% with 0 failures
 Completed [============================>-------------------------------------------]  40% with 0 failures
 Completed [============================>-------------------------------------------]  41% with 0 failures
 Completed [=============================>------------------------------------------]  41% with 0 failures
 Completed [=============================>------------------------------------------]  42% with 0 failures
 Completed [==============================>-----------------------------------------]  42% with 0 failures
 Completed [==============================>-----------------------------------------]  43% with 0 failures
 Completed [==============================>-----------------------------------------]  44% with 0 failures
 Completed [===============================>----------------------------------------]  44% with 0 failures
 Completed [===============================>----------------------------------------]  45% with 0 failures
 Completed [================================>---------------------------------------]  45% with 0 failures
 Completed [================================>---------------------------------------]  46% with 0 failures
 Completed [================================>---------------------------------------]  47% with 0 failures
 Completed [=================================>--------------------------------------]  47% with 0 failures
 Completed [=================================>--------------------------------------]  48% with 0 failures
 Completed [==================================>-------------------------------------]  48% with 0 failures
 Completed [==================================>-------------------------------------]  49% with 0 failures
 Completed [===================================>------------------------------------]  49% with 0 failures
 Completed [===================================>------------------------------------]  50% with 0 failures
 Completed [===================================>------------------------------------]  51% with 0 failures
 Completed [====================================>-----------------------------------]  51% with 0 failures
 Completed [====================================>-----------------------------------]  52% with 0 failures
 Completed [=====================================>----------------------------------]  52% with 0 failures
 Completed [=====================================>----------------------------------]  53% with 0 failures
 Completed [======================================>---------------------------------]  53% with 0 failures
 Completed [======================================>---------------------------------]  54% with 0 failures
 Completed [======================================>---------------------------------]  55% with 0 failures
 Completed [=======================================>--------------------------------]  55% with 0 failures
 Completed [=======================================>--------------------------------]  56% with 0 failures
 Completed [========================================>-------------------------------]  56% with 0 failures
 Completed [========================================>-------------------------------]  57% with 0 failures
 Completed [========================================>-------------------------------]  58% with 0 failures
 Completed [=========================================>------------------------------]  58% with 0 failures
 Completed [=========================================>------------------------------]  59% with 0 failures
 Completed [==========================================>-----------------------------]  59% with 0 failures
 Completed [==========================================>-----------------------------]  60% with 0 failures
 Completed [===========================================>----------------------------]  60% with 0 failures
 Completed [===========================================>----------------------------]  61% with 0 failures
 Completed [===========================================>----------------------------]  62% with 0 failures
 Completed [============================================>---------------------------]  62% with 0 failures
 Completed [============================================>---------------------------]  63% with 0 failures
 Completed [=============================================>--------------------------]  63% with 0 failures
 Completed [=============================================>--------------------------]  64% with 0 failures
 Completed [=============================================>--------------------------]  65% with 0 failures
 Completed [==============================================>-------------------------]  65% with 0 failures
 Completed [==============================================>-------------------------]  66% with 0 failures
 Completed [===============================================>------------------------]  66% with 0 failures
 Completed [===============================================>------------------------]  67% with 0 failures
 Completed [================================================>-----------------------]  67% with 0 failures
 Completed [================================================>-----------------------]  68% with 0 failures
 Completed [================================================>-----------------------]  69% with 0 failures
 Completed [=================================================>----------------------]  69% with 0 failures
 Completed [=================================================>----------------------]  70% with 0 failures
 Completed [==================================================>---------------------]  70% with 0 failures
 Completed [==================================================>---------------------]  71% with 0 failures
 Completed [==================================================>---------------------]  72% with 0 failures
 Completed [===================================================>--------------------]  72% with 0 failures
 Completed [===================================================>--------------------]  73% with 0 failures
 Completed [====================================================>-------------------]  73% with 0 failures
 Completed [====================================================>-------------------]  74% with 0 failures
 Completed [=====================================================>------------------]  74% with 0 failures
 Completed [=====================================================>------------------]  75% with 0 failures
 Completed [=====================================================>------------------]  76% with 0 failures
 Completed [======================================================>-----------------]  76% with 0 failures
 Completed [======================================================>-----------------]  77% with 0 failures
 Completed [=======================================================>----------------]  77% with 0 failures
 Completed [=======================================================>----------------]  78% with 0 failures
 Completed [========================================================>---------------]  78% with 0 failures
 Completed [========================================================>---------------]  79% with 0 failures
 Completed [========================================================>---------------]  80% with 0 failures
 Completed [=========================================================>--------------]  80% with 0 failures
 Completed [=========================================================>--------------]  81% with 0 failures
 Completed [==========================================================>-------------]  81% with 0 failures
 Completed [==========================================================>-------------]  82% with 0 failures
 Completed [==========================================================>-------------]  83% with 0 failures
 Completed [===========================================================>------------]  83% with 0 failures
 Completed [===========================================================>------------]  84% with 0 failures
 Completed [============================================================>-----------]  84% with 0 failures
 Completed [============================================================>-----------]  85% with 0 failures
 Completed [=============================================================>----------]  85% with 0 failures
 Completed [=============================================================>----------]  86% with 0 failures
 Completed [=============================================================>----------]  87% with 0 failures
 Completed [==============================================================>---------]  87% with 0 failures
 Completed [==============================================================>---------]  88% with 0 failures
 Completed [===============================================================>--------]  88% with 0 failures
 Completed [===============================================================>--------]  89% with 0 failures
 Completed [===============================================================>--------]  90% with 0 failures
 Completed [================================================================>-------]  90% with 0 failures
 Completed [================================================================>-------]  91% with 0 failures
 Completed [=================================================================>------]  91% with 0 failures
 Completed [=================================================================>------]  92% with 0 failures
 Completed [==================================================================>-----]  92% with 0 failures
 Completed [==================================================================>-----]  93% with 0 failures
 Completed [==================================================================>-----]  94% with 0 failures
 Completed [===================================================================>----]  94% with 0 failures
 Completed [===================================================================>----]  95% with 0 failures
 Completed [====================================================================>---]  95% with 0 failures
 Completed [====================================================================>---]  96% with 0 failures
 Completed [====================================================================>---]  97% with 0 failures
 Completed [=====================================================================>--]  97% with 0 failures
 Completed [=====================================================================>--]  98% with 0 failures
 Completed [======================================================================>-]  98% with 0 failures
 Completed [======================================================================>-]  99% with 0 failures
 Completed [=======================================================================>]  99% with 0 failures
 Completed [=======================================================================>] 100% with 0 failures
 Completed [========================================================================] 100% with 0 failures
                                                                                                          

Done!
fd2_markers <- fd2_markers[fd2_markers$p_val_adj < 0.05, ]
head(fd2_markers, n = 15)
fd2_markers_annotated <- merge(gene_annotations, fd2_markers, by.x = "Gene.ID", by.y = 0)
View(fd2_markers_annotated)

fd3

cells.0 <- subset(tenx.mutant.integrated.sex, idents = "0")
DefaultAssay(cells.0) <- "RNA"
Idents(cells.0) <- "identity_combined"
fd3_markers <- FindMarkers(cells.0, ident.1 = "fd3", ident.2 = c("wild-type (10x)", "wild-type (Smart-seq2)"), test.use = "MAST", verbose = FALSE)
Assuming data assay in position 1, with name et is log-transformed.

 Completed [>-----------------------------------------------------------------------]   1% with 0 failures
 Completed [>-----------------------------------------------------------------------]   2% with 0 failures
 Completed [=>----------------------------------------------------------------------]   2% with 0 failures
 Completed [=>----------------------------------------------------------------------]   3% with 0 failures
 Completed [==>---------------------------------------------------------------------]   3% with 0 failures
 Completed [==>---------------------------------------------------------------------]   4% with 0 failures
 Completed [==>---------------------------------------------------------------------]   5% with 0 failures
 Completed [===>--------------------------------------------------------------------]   5% with 0 failures
 Completed [===>--------------------------------------------------------------------]   6% with 0 failures
 Completed [====>-------------------------------------------------------------------]   6% with 0 failures
 Completed [====>-------------------------------------------------------------------]   7% with 0 failures
 Completed [====>-------------------------------------------------------------------]   8% with 0 failures
 Completed [=====>------------------------------------------------------------------]   8% with 0 failures
 Completed [=====>------------------------------------------------------------------]   9% with 0 failures
 Completed [======>-----------------------------------------------------------------]   9% with 0 failures
 Completed [======>-----------------------------------------------------------------]  10% with 0 failures
 Completed [=======>----------------------------------------------------------------]  10% with 0 failures
 Completed [=======>----------------------------------------------------------------]  11% with 0 failures
 Completed [=======>----------------------------------------------------------------]  12% with 0 failures
 Completed [========>---------------------------------------------------------------]  12% with 0 failures
 Completed [========>---------------------------------------------------------------]  13% with 0 failures
 Completed [=========>--------------------------------------------------------------]  13% with 0 failures
 Completed [=========>--------------------------------------------------------------]  14% with 0 failures
 Completed [=========>--------------------------------------------------------------]  15% with 0 failures
 Completed [==========>-------------------------------------------------------------]  15% with 0 failures
 Completed [==========>-------------------------------------------------------------]  16% with 0 failures
 Completed [===========>------------------------------------------------------------]  16% with 0 failures
 Completed [===========>------------------------------------------------------------]  17% with 0 failures
 Completed [============>-----------------------------------------------------------]  17% with 0 failures
 Completed [============>-----------------------------------------------------------]  18% with 0 failures
 Completed [============>-----------------------------------------------------------]  19% with 0 failures
 Completed [=============>----------------------------------------------------------]  19% with 0 failures
 Completed [=============>----------------------------------------------------------]  20% with 0 failures
 Completed [==============>---------------------------------------------------------]  20% with 0 failures
 Completed [==============>---------------------------------------------------------]  21% with 0 failures
 Completed [===============>--------------------------------------------------------]  22% with 0 failures
 Completed [===============>--------------------------------------------------------]  23% with 0 failures
 Completed [================>-------------------------------------------------------]  23% with 0 failures
 Completed [================>-------------------------------------------------------]  24% with 0 failures
 Completed [=================>------------------------------------------------------]  24% with 0 failures
 Completed [=================>------------------------------------------------------]  25% with 0 failures
 Completed [=================>------------------------------------------------------]  26% with 0 failures
 Completed [==================>-----------------------------------------------------]  26% with 0 failures
 Completed [==================>-----------------------------------------------------]  27% with 0 failures
 Completed [===================>----------------------------------------------------]  27% with 0 failures
 Completed [===================>----------------------------------------------------]  28% with 0 failures
 Completed [====================>---------------------------------------------------]  29% with 0 failures
 Completed [====================>---------------------------------------------------]  30% with 0 failures
 Completed [=====================>--------------------------------------------------]  30% with 0 failures
 Completed [=====================>--------------------------------------------------]  31% with 0 failures
 Completed [======================>-------------------------------------------------]  31% with 0 failures
 Completed [======================>-------------------------------------------------]  32% with 0 failures
 Completed [======================>-------------------------------------------------]  33% with 0 failures
 Completed [=======================>------------------------------------------------]  33% with 0 failures
 Completed [=======================>------------------------------------------------]  34% with 0 failures
 Completed [========================>-----------------------------------------------]  34% with 0 failures
 Completed [========================>-----------------------------------------------]  35% with 0 failures
 Completed [=========================>----------------------------------------------]  35% with 0 failures
 Completed [=========================>----------------------------------------------]  36% with 0 failures
 Completed [=========================>----------------------------------------------]  37% with 0 failures
 Completed [==========================>---------------------------------------------]  37% with 0 failures
 Completed [==========================>---------------------------------------------]  38% with 0 failures
 Completed [===========================>--------------------------------------------]  38% with 0 failures
 Completed [===========================>--------------------------------------------]  39% with 0 failures
 Completed [===========================>--------------------------------------------]  40% with 0 failures
 Completed [============================>-------------------------------------------]  40% with 0 failures
 Completed [============================>-------------------------------------------]  41% with 0 failures
 Completed [=============================>------------------------------------------]  41% with 0 failures
 Completed [=============================>------------------------------------------]  42% with 0 failures
 Completed [==============================>-----------------------------------------]  42% with 0 failures
 Completed [==============================>-----------------------------------------]  43% with 0 failures
 Completed [==============================>-----------------------------------------]  44% with 0 failures
 Completed [===============================>----------------------------------------]  44% with 0 failures
 Completed [===============================>----------------------------------------]  45% with 0 failures
 Completed [================================>---------------------------------------]  45% with 0 failures
 Completed [================================>---------------------------------------]  46% with 0 failures
 Completed [================================>---------------------------------------]  47% with 0 failures
 Completed [=================================>--------------------------------------]  47% with 0 failures
 Completed [=================================>--------------------------------------]  48% with 0 failures
 Completed [==================================>-------------------------------------]  48% with 0 failures
 Completed [==================================>-------------------------------------]  49% with 0 failures
 Completed [===================================>------------------------------------]  49% with 0 failures
 Completed [===================================>------------------------------------]  50% with 0 failures
 Completed [===================================>------------------------------------]  51% with 0 failures
 Completed [====================================>-----------------------------------]  51% with 0 failures
 Completed [====================================>-----------------------------------]  52% with 0 failures
 Completed [=====================================>----------------------------------]  52% with 0 failures
 Completed [=====================================>----------------------------------]  53% with 0 failures
 Completed [======================================>---------------------------------]  53% with 0 failures
 Completed [======================================>---------------------------------]  54% with 0 failures
 Completed [======================================>---------------------------------]  55% with 0 failures
 Completed [=======================================>--------------------------------]  55% with 0 failures
 Completed [=======================================>--------------------------------]  56% with 0 failures
 Completed [========================================>-------------------------------]  56% with 0 failures
 Completed [========================================>-------------------------------]  57% with 0 failures
 Completed [========================================>-------------------------------]  58% with 0 failures
 Completed [=========================================>------------------------------]  58% with 0 failures
 Completed [=========================================>------------------------------]  59% with 0 failures
 Completed [==========================================>-----------------------------]  59% with 0 failures
 Completed [==========================================>-----------------------------]  60% with 0 failures
 Completed [===========================================>----------------------------]  60% with 0 failures
 Completed [===========================================>----------------------------]  61% with 0 failures
 Completed [===========================================>----------------------------]  62% with 0 failures
 Completed [============================================>---------------------------]  62% with 0 failures
 Completed [============================================>---------------------------]  63% with 0 failures
 Completed [=============================================>--------------------------]  63% with 0 failures
 Completed [=============================================>--------------------------]  64% with 0 failures
 Completed [=============================================>--------------------------]  65% with 0 failures
 Completed [==============================================>-------------------------]  65% with 0 failures
 Completed [==============================================>-------------------------]  66% with 0 failures
 Completed [===============================================>------------------------]  66% with 0 failures
 Completed [===============================================>------------------------]  67% with 0 failures
 Completed [================================================>-----------------------]  67% with 0 failures
 Completed [================================================>-----------------------]  68% with 0 failures
 Completed [================================================>-----------------------]  69% with 0 failures
 Completed [=================================================>----------------------]  69% with 0 failures
 Completed [=================================================>----------------------]  70% with 0 failures
 Completed [==================================================>---------------------]  70% with 0 failures
 Completed [==================================================>---------------------]  71% with 0 failures
 Completed [===================================================>--------------------]  72% with 0 failures
 Completed [===================================================>--------------------]  73% with 0 failures
 Completed [====================================================>-------------------]  73% with 0 failures
 Completed [====================================================>-------------------]  74% with 0 failures
 Completed [=====================================================>------------------]  74% with 0 failures
 Completed [=====================================================>------------------]  75% with 0 failures
 Completed [=====================================================>------------------]  76% with 0 failures
 Completed [======================================================>-----------------]  76% with 0 failures
 Completed [======================================================>-----------------]  77% with 0 failures
 Completed [=======================================================>----------------]  77% with 0 failures
 Completed [=======================================================>----------------]  78% with 0 failures
 Completed [========================================================>---------------]  79% with 0 failures
 Completed [========================================================>---------------]  80% with 0 failures
 Completed [=========================================================>--------------]  80% with 0 failures
 Completed [=========================================================>--------------]  81% with 0 failures
 Completed [==========================================================>-------------]  81% with 0 failures
 Completed [==========================================================>-------------]  82% with 0 failures
 Completed [==========================================================>-------------]  83% with 0 failures
 Completed [===========================================================>------------]  83% with 0 failures
 Completed [===========================================================>------------]  84% with 0 failures
 Completed [============================================================>-----------]  84% with 0 failures
 Completed [============================================================>-----------]  85% with 0 failures
 Completed [=============================================================>----------]  85% with 0 failures
 Completed [=============================================================>----------]  86% with 0 failures
 Completed [=============================================================>----------]  87% with 0 failures
 Completed [==============================================================>---------]  87% with 0 failures
 Completed [==============================================================>---------]  88% with 0 failures
 Completed [===============================================================>--------]  88% with 0 failures
 Completed [===============================================================>--------]  89% with 0 failures
 Completed [===============================================================>--------]  90% with 0 failures
 Completed [================================================================>-------]  90% with 0 failures
 Completed [================================================================>-------]  91% with 0 failures
 Completed [=================================================================>------]  91% with 0 failures
 Completed [=================================================================>------]  92% with 0 failures
 Completed [==================================================================>-----]  92% with 0 failures
 Completed [==================================================================>-----]  93% with 0 failures
 Completed [==================================================================>-----]  94% with 0 failures
 Completed [===================================================================>----]  94% with 0 failures
 Completed [===================================================================>----]  95% with 0 failures
 Completed [====================================================================>---]  95% with 0 failures
 Completed [====================================================================>---]  96% with 0 failures
 Completed [====================================================================>---]  97% with 0 failures
 Completed [=====================================================================>--]  97% with 0 failures
 Completed [=====================================================================>--]  98% with 0 failures
 Completed [======================================================================>-]  98% with 0 failures
 Completed [======================================================================>-]  99% with 0 failures
 Completed [=======================================================================>]  99% with 0 failures
 Completed [=======================================================================>] 100% with 0 failures
 Completed [========================================================================] 100% with 0 failures
                                                                                                          

Done!
Combining coefficients and standard errors
Calculating log-fold changes
Calculating likelihood ratio tests
Refitting on reduced model...

 Completed [>-----------------------------------------------------------------------]   1% with 0 failures
 Completed [>-----------------------------------------------------------------------]   2% with 0 failures
 Completed [=>----------------------------------------------------------------------]   2% with 0 failures
 Completed [=>----------------------------------------------------------------------]   3% with 0 failures
 Completed [==>---------------------------------------------------------------------]   3% with 0 failures
 Completed [==>---------------------------------------------------------------------]   4% with 0 failures
 Completed [==>---------------------------------------------------------------------]   5% with 0 failures
 Completed [===>--------------------------------------------------------------------]   5% with 0 failures
 Completed [===>--------------------------------------------------------------------]   6% with 0 failures
 Completed [====>-------------------------------------------------------------------]   6% with 0 failures
 Completed [====>-------------------------------------------------------------------]   7% with 0 failures
 Completed [====>-------------------------------------------------------------------]   8% with 0 failures
 Completed [=====>------------------------------------------------------------------]   8% with 0 failures
 Completed [=====>------------------------------------------------------------------]   9% with 0 failures
 Completed [======>-----------------------------------------------------------------]   9% with 0 failures
 Completed [======>-----------------------------------------------------------------]  10% with 0 failures
 Completed [=======>----------------------------------------------------------------]  10% with 0 failures
 Completed [=======>----------------------------------------------------------------]  11% with 0 failures
 Completed [=======>----------------------------------------------------------------]  12% with 0 failures
 Completed [========>---------------------------------------------------------------]  12% with 0 failures
 Completed [========>---------------------------------------------------------------]  13% with 0 failures
 Completed [=========>--------------------------------------------------------------]  13% with 0 failures
 Completed [=========>--------------------------------------------------------------]  14% with 0 failures
 Completed [=========>--------------------------------------------------------------]  15% with 0 failures
 Completed [==========>-------------------------------------------------------------]  15% with 0 failures
 Completed [==========>-------------------------------------------------------------]  16% with 0 failures
 Completed [===========>------------------------------------------------------------]  16% with 0 failures
 Completed [===========>------------------------------------------------------------]  17% with 0 failures
 Completed [============>-----------------------------------------------------------]  17% with 0 failures
 Completed [============>-----------------------------------------------------------]  18% with 0 failures
 Completed [============>-----------------------------------------------------------]  19% with 0 failures
 Completed [=============>----------------------------------------------------------]  19% with 0 failures
 Completed [=============>----------------------------------------------------------]  20% with 0 failures
 Completed [==============>---------------------------------------------------------]  20% with 0 failures
 Completed [==============>---------------------------------------------------------]  21% with 0 failures
 Completed [===============>--------------------------------------------------------]  22% with 0 failures
 Completed [===============>--------------------------------------------------------]  23% with 0 failures
 Completed [================>-------------------------------------------------------]  23% with 0 failures
 Completed [================>-------------------------------------------------------]  24% with 0 failures
 Completed [=================>------------------------------------------------------]  24% with 0 failures
 Completed [=================>------------------------------------------------------]  25% with 0 failures
 Completed [=================>------------------------------------------------------]  26% with 0 failures
 Completed [==================>-----------------------------------------------------]  26% with 0 failures
 Completed [==================>-----------------------------------------------------]  27% with 0 failures
 Completed [===================>----------------------------------------------------]  27% with 0 failures
 Completed [===================>----------------------------------------------------]  28% with 0 failures
 Completed [====================>---------------------------------------------------]  29% with 0 failures
 Completed [====================>---------------------------------------------------]  30% with 0 failures
 Completed [=====================>--------------------------------------------------]  30% with 0 failures
 Completed [=====================>--------------------------------------------------]  31% with 0 failures
 Completed [======================>-------------------------------------------------]  31% with 0 failures
 Completed [======================>-------------------------------------------------]  32% with 0 failures
 Completed [======================>-------------------------------------------------]  33% with 0 failures
 Completed [=======================>------------------------------------------------]  33% with 0 failures
 Completed [=======================>------------------------------------------------]  34% with 0 failures
 Completed [========================>-----------------------------------------------]  34% with 0 failures
 Completed [========================>-----------------------------------------------]  35% with 0 failures
 Completed [=========================>----------------------------------------------]  35% with 0 failures
 Completed [=========================>----------------------------------------------]  36% with 0 failures
 Completed [=========================>----------------------------------------------]  37% with 0 failures
 Completed [==========================>---------------------------------------------]  37% with 0 failures
 Completed [==========================>---------------------------------------------]  38% with 0 failures
 Completed [===========================>--------------------------------------------]  38% with 0 failures
 Completed [===========================>--------------------------------------------]  39% with 0 failures
 Completed [===========================>--------------------------------------------]  40% with 0 failures
 Completed [============================>-------------------------------------------]  40% with 0 failures
 Completed [============================>-------------------------------------------]  41% with 0 failures
 Completed [=============================>------------------------------------------]  41% with 0 failures
 Completed [=============================>------------------------------------------]  42% with 0 failures
 Completed [==============================>-----------------------------------------]  42% with 0 failures
 Completed [==============================>-----------------------------------------]  43% with 0 failures
 Completed [==============================>-----------------------------------------]  44% with 0 failures
 Completed [===============================>----------------------------------------]  44% with 0 failures
 Completed [===============================>----------------------------------------]  45% with 0 failures
 Completed [================================>---------------------------------------]  45% with 0 failures
 Completed [================================>---------------------------------------]  46% with 0 failures
 Completed [================================>---------------------------------------]  47% with 0 failures
 Completed [=================================>--------------------------------------]  47% with 0 failures
 Completed [=================================>--------------------------------------]  48% with 0 failures
 Completed [==================================>-------------------------------------]  48% with 0 failures
 Completed [==================================>-------------------------------------]  49% with 0 failures
 Completed [===================================>------------------------------------]  49% with 0 failures
 Completed [===================================>------------------------------------]  50% with 0 failures
 Completed [===================================>------------------------------------]  51% with 0 failures
 Completed [====================================>-----------------------------------]  51% with 0 failures
 Completed [====================================>-----------------------------------]  52% with 0 failures
 Completed [=====================================>----------------------------------]  52% with 0 failures
 Completed [=====================================>----------------------------------]  53% with 0 failures
 Completed [======================================>---------------------------------]  53% with 0 failures
 Completed [======================================>---------------------------------]  54% with 0 failures
 Completed [======================================>---------------------------------]  55% with 0 failures
 Completed [=======================================>--------------------------------]  55% with 0 failures
 Completed [=======================================>--------------------------------]  56% with 0 failures
 Completed [========================================>-------------------------------]  56% with 0 failures
 Completed [========================================>-------------------------------]  57% with 0 failures
 Completed [========================================>-------------------------------]  58% with 0 failures
 Completed [=========================================>------------------------------]  58% with 0 failures
 Completed [=========================================>------------------------------]  59% with 0 failures
 Completed [==========================================>-----------------------------]  59% with 0 failures
 Completed [==========================================>-----------------------------]  60% with 0 failures
 Completed [===========================================>----------------------------]  60% with 0 failures
 Completed [===========================================>----------------------------]  61% with 0 failures
 Completed [===========================================>----------------------------]  62% with 0 failures
 Completed [============================================>---------------------------]  62% with 0 failures
 Completed [============================================>---------------------------]  63% with 0 failures
 Completed [=============================================>--------------------------]  63% with 0 failures
 Completed [=============================================>--------------------------]  64% with 0 failures
 Completed [=============================================>--------------------------]  65% with 0 failures
 Completed [==============================================>-------------------------]  65% with 0 failures
 Completed [==============================================>-------------------------]  66% with 0 failures
 Completed [===============================================>------------------------]  66% with 0 failures
 Completed [===============================================>------------------------]  67% with 0 failures
 Completed [================================================>-----------------------]  67% with 0 failures
 Completed [================================================>-----------------------]  68% with 0 failures
 Completed [================================================>-----------------------]  69% with 0 failures
 Completed [=================================================>----------------------]  69% with 0 failures
 Completed [=================================================>----------------------]  70% with 0 failures
 Completed [==================================================>---------------------]  70% with 0 failures
 Completed [==================================================>---------------------]  71% with 0 failures
 Completed [===================================================>--------------------]  72% with 0 failures
 Completed [===================================================>--------------------]  73% with 0 failures
 Completed [====================================================>-------------------]  73% with 0 failures
 Completed [====================================================>-------------------]  74% with 0 failures
 Completed [=====================================================>------------------]  74% with 0 failures
 Completed [=====================================================>------------------]  75% with 0 failures
 Completed [=====================================================>------------------]  76% with 0 failures
 Completed [======================================================>-----------------]  76% with 0 failures
 Completed [======================================================>-----------------]  77% with 0 failures
 Completed [=======================================================>----------------]  77% with 0 failures
 Completed [=======================================================>----------------]  78% with 0 failures
 Completed [========================================================>---------------]  79% with 0 failures
 Completed [========================================================>---------------]  80% with 0 failures
 Completed [=========================================================>--------------]  80% with 0 failures
 Completed [=========================================================>--------------]  81% with 0 failures
 Completed [==========================================================>-------------]  81% with 0 failures
 Completed [==========================================================>-------------]  82% with 0 failures
 Completed [==========================================================>-------------]  83% with 0 failures
 Completed [===========================================================>------------]  83% with 0 failures
 Completed [===========================================================>------------]  84% with 0 failures
 Completed [============================================================>-----------]  84% with 0 failures
 Completed [============================================================>-----------]  85% with 0 failures
 Completed [=============================================================>----------]  85% with 0 failures
 Completed [=============================================================>----------]  86% with 0 failures
 Completed [=============================================================>----------]  87% with 0 failures
 Completed [==============================================================>---------]  87% with 0 failures
 Completed [==============================================================>---------]  88% with 0 failures
 Completed [===============================================================>--------]  88% with 0 failures
 Completed [===============================================================>--------]  89% with 0 failures
 Completed [===============================================================>--------]  90% with 0 failures
 Completed [================================================================>-------]  90% with 0 failures
 Completed [================================================================>-------]  91% with 0 failures
 Completed [=================================================================>------]  91% with 0 failures
 Completed [=================================================================>------]  92% with 0 failures
 Completed [==================================================================>-----]  92% with 0 failures
 Completed [==================================================================>-----]  93% with 0 failures
 Completed [==================================================================>-----]  94% with 0 failures
 Completed [===================================================================>----]  94% with 0 failures
 Completed [===================================================================>----]  95% with 0 failures
 Completed [====================================================================>---]  95% with 0 failures
 Completed [====================================================================>---]  96% with 0 failures
 Completed [====================================================================>---]  97% with 0 failures
 Completed [=====================================================================>--]  97% with 0 failures
 Completed [=====================================================================>--]  98% with 0 failures
 Completed [======================================================================>-]  98% with 0 failures
 Completed [======================================================================>-]  99% with 0 failures
 Completed [=======================================================================>]  99% with 0 failures
 Completed [=======================================================================>] 100% with 0 failures
 Completed [========================================================================] 100% with 0 failures
                                                                                                          

Done!
fd3_markers <- fd3_markers[fd3_markers$p_val_adj < 0.05, ]
head(fd3_markers, n = 15)
fd3_markers_annotated <- merge(gene_annotations, fd3_markers, by.x = "Gene.ID", by.y = 0)
View(fd3_markers_annotated)

fd4

cells.0 <- subset(tenx.mutant.integrated.sex, idents = "0")
DefaultAssay(cells.0) <- "RNA"
Idents(cells.0) <- "identity_combined"
fd4_markers <- FindMarkers(cells.0, ident.1 = "fd4", ident.2 = c("wild-type (10x)", "wild-type (Smart-seq2)"), test.use = "MAST", verbose = FALSE)
Assuming data assay in position 1, with name et is log-transformed.

 Completed [>-----------------------------------------------------------------------]   2% with 0 failures
 Completed [=>----------------------------------------------------------------------]   2% with 0 failures
 Completed [=>----------------------------------------------------------------------]   3% with 0 failures
 Completed [==>---------------------------------------------------------------------]   3% with 0 failures
 Completed [==>---------------------------------------------------------------------]   4% with 0 failures
 Completed [==>---------------------------------------------------------------------]   5% with 0 failures
 Completed [===>--------------------------------------------------------------------]   5% with 0 failures
 Completed [===>--------------------------------------------------------------------]   6% with 0 failures
 Completed [====>-------------------------------------------------------------------]   6% with 0 failures
 Completed [====>-------------------------------------------------------------------]   7% with 0 failures
 Completed [====>-------------------------------------------------------------------]   8% with 0 failures
 Completed [=====>------------------------------------------------------------------]   8% with 0 failures
 Completed [=====>------------------------------------------------------------------]   9% with 0 failures
 Completed [======>-----------------------------------------------------------------]   9% with 0 failures
 Completed [======>-----------------------------------------------------------------]  10% with 0 failures
 Completed [=======>----------------------------------------------------------------]  10% with 0 failures
 Completed [=======>----------------------------------------------------------------]  11% with 0 failures
 Completed [=======>----------------------------------------------------------------]  12% with 0 failures
 Completed [========>---------------------------------------------------------------]  12% with 0 failures
 Completed [========>---------------------------------------------------------------]  13% with 0 failures
 Completed [=========>--------------------------------------------------------------]  13% with 0 failures
 Completed [=========>--------------------------------------------------------------]  14% with 0 failures
 Completed [=========>--------------------------------------------------------------]  15% with 0 failures
 Completed [==========>-------------------------------------------------------------]  15% with 0 failures
 Completed [==========>-------------------------------------------------------------]  16% with 0 failures
 Completed [===========>------------------------------------------------------------]  16% with 0 failures
 Completed [===========>------------------------------------------------------------]  17% with 0 failures
 Completed [============>-----------------------------------------------------------]  17% with 0 failures
 Completed [============>-----------------------------------------------------------]  18% with 0 failures
 Completed [============>-----------------------------------------------------------]  19% with 0 failures
 Completed [=============>----------------------------------------------------------]  19% with 0 failures
 Completed [=============>----------------------------------------------------------]  20% with 0 failures
 Completed [==============>---------------------------------------------------------]  20% with 0 failures
 Completed [==============>---------------------------------------------------------]  21% with 0 failures
 Completed [===============>--------------------------------------------------------]  22% with 0 failures
 Completed [===============>--------------------------------------------------------]  23% with 0 failures
 Completed [================>-------------------------------------------------------]  23% with 0 failures
 Completed [================>-------------------------------------------------------]  24% with 0 failures
 Completed [=================>------------------------------------------------------]  24% with 0 failures
 Completed [=================>------------------------------------------------------]  25% with 0 failures
 Completed [=================>------------------------------------------------------]  26% with 0 failures
 Completed [==================>-----------------------------------------------------]  26% with 0 failures
 Completed [==================>-----------------------------------------------------]  27% with 0 failures
 Completed [===================>----------------------------------------------------]  27% with 0 failures
 Completed [===================>----------------------------------------------------]  28% with 0 failures
 Completed [====================>---------------------------------------------------]  29% with 0 failures
 Completed [====================>---------------------------------------------------]  30% with 0 failures
 Completed [=====================>--------------------------------------------------]  30% with 0 failures
 Completed [=====================>--------------------------------------------------]  31% with 0 failures
 Completed [======================>-------------------------------------------------]  31% with 0 failures
 Completed [======================>-------------------------------------------------]  32% with 0 failures
 Completed [======================>-------------------------------------------------]  33% with 0 failures
 Completed [=======================>------------------------------------------------]  33% with 0 failures
 Completed [=======================>------------------------------------------------]  34% with 0 failures
 Completed [========================>-----------------------------------------------]  34% with 0 failures
 Completed [========================>-----------------------------------------------]  35% with 0 failures
 Completed [=========================>----------------------------------------------]  35% with 0 failures
 Completed [=========================>----------------------------------------------]  36% with 0 failures
 Completed [=========================>----------------------------------------------]  37% with 0 failures
 Completed [==========================>---------------------------------------------]  37% with 0 failures
 Completed [==========================>---------------------------------------------]  38% with 0 failures
 Completed [===========================>--------------------------------------------]  38% with 0 failures
 Completed [===========================>--------------------------------------------]  39% with 0 failures
 Completed [===========================>--------------------------------------------]  40% with 0 failures
 Completed [============================>-------------------------------------------]  40% with 0 failures
 Completed [============================>-------------------------------------------]  41% with 0 failures
 Completed [=============================>------------------------------------------]  41% with 0 failures
 Completed [=============================>------------------------------------------]  42% with 0 failures
 Completed [==============================>-----------------------------------------]  42% with 0 failures
 Completed [==============================>-----------------------------------------]  43% with 0 failures
 Completed [==============================>-----------------------------------------]  44% with 0 failures
 Completed [===============================>----------------------------------------]  44% with 0 failures
 Completed [===============================>----------------------------------------]  45% with 0 failures
 Completed [================================>---------------------------------------]  45% with 0 failures
 Completed [================================>---------------------------------------]  46% with 0 failures
 Completed [================================>---------------------------------------]  47% with 0 failures
 Completed [=================================>--------------------------------------]  47% with 0 failures
 Completed [=================================>--------------------------------------]  48% with 0 failures
 Completed [==================================>-------------------------------------]  48% with 0 failures
 Completed [==================================>-------------------------------------]  49% with 0 failures
 Completed [===================================>------------------------------------]  49% with 0 failures
 Completed [===================================>------------------------------------]  50% with 0 failures
 Completed [===================================>------------------------------------]  51% with 0 failures
 Completed [====================================>-----------------------------------]  51% with 0 failures
 Completed [====================================>-----------------------------------]  52% with 0 failures
 Completed [=====================================>----------------------------------]  52% with 0 failures
 Completed [=====================================>----------------------------------]  53% with 0 failures
 Completed [======================================>---------------------------------]  53% with 0 failures
 Completed [======================================>---------------------------------]  54% with 0 failures
 Completed [======================================>---------------------------------]  55% with 0 failures
 Completed [=======================================>--------------------------------]  55% with 0 failures
 Completed [=======================================>--------------------------------]  56% with 0 failures
 Completed [========================================>-------------------------------]  56% with 0 failures
 Completed [========================================>-------------------------------]  57% with 0 failures
 Completed [========================================>-------------------------------]  58% with 0 failures
 Completed [=========================================>------------------------------]  58% with 0 failures
 Completed [=========================================>------------------------------]  59% with 0 failures
 Completed [==========================================>-----------------------------]  59% with 0 failures
 Completed [==========================================>-----------------------------]  60% with 0 failures
 Completed [===========================================>----------------------------]  60% with 0 failures
 Completed [===========================================>----------------------------]  61% with 0 failures
 Completed [===========================================>----------------------------]  62% with 0 failures
 Completed [============================================>---------------------------]  62% with 0 failures
 Completed [============================================>---------------------------]  63% with 0 failures
 Completed [=============================================>--------------------------]  63% with 0 failures
 Completed [=============================================>--------------------------]  64% with 0 failures
 Completed [=============================================>--------------------------]  65% with 0 failures
 Completed [==============================================>-------------------------]  65% with 0 failures
 Completed [==============================================>-------------------------]  66% with 0 failures
 Completed [===============================================>------------------------]  66% with 0 failures
 Completed [===============================================>------------------------]  67% with 0 failures
 Completed [================================================>-----------------------]  67% with 0 failures
 Completed [================================================>-----------------------]  68% with 0 failures
 Completed [================================================>-----------------------]  69% with 0 failures
 Completed [=================================================>----------------------]  69% with 0 failures
 Completed [=================================================>----------------------]  70% with 0 failures
 Completed [==================================================>---------------------]  70% with 0 failures
 Completed [==================================================>---------------------]  71% with 0 failures
 Completed [===================================================>--------------------]  72% with 0 failures
 Completed [===================================================>--------------------]  73% with 0 failures
 Completed [====================================================>-------------------]  73% with 0 failures
 Completed [====================================================>-------------------]  74% with 0 failures
 Completed [=====================================================>------------------]  74% with 0 failures
 Completed [=====================================================>------------------]  75% with 0 failures
 Completed [=====================================================>------------------]  76% with 0 failures
 Completed [======================================================>-----------------]  76% with 0 failures
 Completed [======================================================>-----------------]  77% with 0 failures
 Completed [=======================================================>----------------]  77% with 0 failures
 Completed [=======================================================>----------------]  78% with 0 failures
 Completed [========================================================>---------------]  79% with 0 failures
 Completed [========================================================>---------------]  80% with 0 failures
 Completed [=========================================================>--------------]  80% with 0 failures
 Completed [=========================================================>--------------]  81% with 0 failures
 Completed [==========================================================>-------------]  81% with 0 failures
 Completed [==========================================================>-------------]  82% with 0 failures
 Completed [==========================================================>-------------]  83% with 0 failures
 Completed [===========================================================>------------]  83% with 0 failures
 Completed [===========================================================>------------]  84% with 0 failures
 Completed [============================================================>-----------]  84% with 0 failures
 Completed [============================================================>-----------]  85% with 0 failures
 Completed [=============================================================>----------]  85% with 0 failures
 Completed [=============================================================>----------]  86% with 0 failures
 Completed [=============================================================>----------]  87% with 0 failures
 Completed [==============================================================>---------]  87% with 0 failures
 Completed [==============================================================>---------]  88% with 0 failures
 Completed [===============================================================>--------]  88% with 0 failures
 Completed [===============================================================>--------]  89% with 0 failures
 Completed [===============================================================>--------]  90% with 0 failures
 Completed [================================================================>-------]  90% with 0 failures
 Completed [================================================================>-------]  91% with 0 failures
 Completed [=================================================================>------]  91% with 0 failures
 Completed [=================================================================>------]  92% with 0 failures
 Completed [==================================================================>-----]  92% with 0 failures
 Completed [==================================================================>-----]  93% with 0 failures
 Completed [==================================================================>-----]  94% with 0 failures
 Completed [===================================================================>----]  94% with 0 failures
 Completed [===================================================================>----]  95% with 0 failures
 Completed [====================================================================>---]  95% with 0 failures
 Completed [====================================================================>---]  96% with 0 failures
 Completed [====================================================================>---]  97% with 0 failures
 Completed [=====================================================================>--]  97% with 0 failures
 Completed [=====================================================================>--]  98% with 0 failures
 Completed [======================================================================>-]  98% with 0 failures
 Completed [======================================================================>-]  99% with 0 failures
 Completed [=======================================================================>]  99% with 0 failures
 Completed [=======================================================================>] 100% with 0 failures
 Completed [========================================================================] 100% with 0 failures
                                                                                                          

Done!
Combining coefficients and standard errors
Calculating log-fold changes
Calculating likelihood ratio tests
Refitting on reduced model...

 Completed [=>----------------------------------------------------------------------]   2% with 0 failures
 Completed [=>----------------------------------------------------------------------]   3% with 0 failures
 Completed [==>---------------------------------------------------------------------]   3% with 0 failures
 Completed [==>---------------------------------------------------------------------]   4% with 0 failures
 Completed [==>---------------------------------------------------------------------]   5% with 0 failures
 Completed [===>--------------------------------------------------------------------]   5% with 0 failures
 Completed [===>--------------------------------------------------------------------]   6% with 0 failures
 Completed [====>-------------------------------------------------------------------]   6% with 0 failures
 Completed [====>-------------------------------------------------------------------]   7% with 0 failures
 Completed [====>-------------------------------------------------------------------]   8% with 0 failures
 Completed [=====>------------------------------------------------------------------]   8% with 0 failures
 Completed [=====>------------------------------------------------------------------]   9% with 0 failures
 Completed [======>-----------------------------------------------------------------]   9% with 0 failures
 Completed [======>-----------------------------------------------------------------]  10% with 0 failures
 Completed [=======>----------------------------------------------------------------]  10% with 0 failures
 Completed [=======>----------------------------------------------------------------]  11% with 0 failures
 Completed [=======>----------------------------------------------------------------]  12% with 0 failures
 Completed [========>---------------------------------------------------------------]  12% with 0 failures
 Completed [========>---------------------------------------------------------------]  13% with 0 failures
 Completed [=========>--------------------------------------------------------------]  13% with 0 failures
 Completed [=========>--------------------------------------------------------------]  14% with 0 failures
 Completed [=========>--------------------------------------------------------------]  15% with 0 failures
 Completed [==========>-------------------------------------------------------------]  15% with 0 failures
 Completed [==========>-------------------------------------------------------------]  16% with 0 failures
 Completed [===========>------------------------------------------------------------]  16% with 0 failures
 Completed [===========>------------------------------------------------------------]  17% with 0 failures
 Completed [============>-----------------------------------------------------------]  17% with 0 failures
 Completed [============>-----------------------------------------------------------]  18% with 0 failures
 Completed [============>-----------------------------------------------------------]  19% with 0 failures
 Completed [=============>----------------------------------------------------------]  19% with 0 failures
 Completed [=============>----------------------------------------------------------]  20% with 0 failures
 Completed [==============>---------------------------------------------------------]  20% with 0 failures
 Completed [==============>---------------------------------------------------------]  21% with 0 failures
 Completed [===============>--------------------------------------------------------]  22% with 0 failures
 Completed [===============>--------------------------------------------------------]  23% with 0 failures
 Completed [================>-------------------------------------------------------]  23% with 0 failures
 Completed [================>-------------------------------------------------------]  24% with 0 failures
 Completed [=================>------------------------------------------------------]  24% with 0 failures
 Completed [=================>------------------------------------------------------]  25% with 0 failures
 Completed [=================>------------------------------------------------------]  26% with 0 failures
 Completed [==================>-----------------------------------------------------]  26% with 0 failures
 Completed [==================>-----------------------------------------------------]  27% with 0 failures
 Completed [===================>----------------------------------------------------]  27% with 0 failures
 Completed [===================>----------------------------------------------------]  28% with 0 failures
 Completed [====================>---------------------------------------------------]  29% with 0 failures
 Completed [====================>---------------------------------------------------]  30% with 0 failures
 Completed [=====================>--------------------------------------------------]  30% with 0 failures
 Completed [=====================>--------------------------------------------------]  31% with 0 failures
 Completed [======================>-------------------------------------------------]  31% with 0 failures
 Completed [======================>-------------------------------------------------]  32% with 0 failures
 Completed [======================>-------------------------------------------------]  33% with 0 failures
 Completed [=======================>------------------------------------------------]  33% with 0 failures
 Completed [=======================>------------------------------------------------]  34% with 0 failures
 Completed [========================>-----------------------------------------------]  34% with 0 failures
 Completed [========================>-----------------------------------------------]  35% with 0 failures
 Completed [=========================>----------------------------------------------]  35% with 0 failures
 Completed [=========================>----------------------------------------------]  36% with 0 failures
 Completed [=========================>----------------------------------------------]  37% with 0 failures
 Completed [==========================>---------------------------------------------]  37% with 0 failures
 Completed [==========================>---------------------------------------------]  38% with 0 failures
 Completed [===========================>--------------------------------------------]  38% with 0 failures
 Completed [===========================>--------------------------------------------]  39% with 0 failures
 Completed [===========================>--------------------------------------------]  40% with 0 failures
 Completed [============================>-------------------------------------------]  40% with 0 failures
 Completed [============================>-------------------------------------------]  41% with 0 failures
 Completed [=============================>------------------------------------------]  41% with 0 failures
 Completed [=============================>------------------------------------------]  42% with 0 failures
 Completed [==============================>-----------------------------------------]  42% with 0 failures
 Completed [==============================>-----------------------------------------]  43% with 0 failures
 Completed [==============================>-----------------------------------------]  44% with 0 failures
 Completed [===============================>----------------------------------------]  44% with 0 failures
 Completed [===============================>----------------------------------------]  45% with 0 failures
 Completed [================================>---------------------------------------]  45% with 0 failures
 Completed [================================>---------------------------------------]  46% with 0 failures
 Completed [================================>---------------------------------------]  47% with 0 failures
 Completed [=================================>--------------------------------------]  47% with 0 failures
 Completed [=================================>--------------------------------------]  48% with 0 failures
 Completed [==================================>-------------------------------------]  48% with 0 failures
 Completed [==================================>-------------------------------------]  49% with 0 failures
 Completed [===================================>------------------------------------]  49% with 0 failures
 Completed [===================================>------------------------------------]  50% with 0 failures
 Completed [===================================>------------------------------------]  51% with 0 failures
 Completed [====================================>-----------------------------------]  51% with 0 failures
 Completed [====================================>-----------------------------------]  52% with 0 failures
 Completed [=====================================>----------------------------------]  52% with 0 failures
 Completed [=====================================>----------------------------------]  53% with 0 failures
 Completed [======================================>---------------------------------]  53% with 0 failures
 Completed [======================================>---------------------------------]  54% with 0 failures
 Completed [======================================>---------------------------------]  55% with 0 failures
 Completed [=======================================>--------------------------------]  55% with 0 failures
 Completed [=======================================>--------------------------------]  56% with 0 failures
 Completed [========================================>-------------------------------]  56% with 0 failures
 Completed [========================================>-------------------------------]  57% with 0 failures
 Completed [========================================>-------------------------------]  58% with 0 failures
 Completed [=========================================>------------------------------]  58% with 0 failures
 Completed [=========================================>------------------------------]  59% with 0 failures
 Completed [==========================================>-----------------------------]  59% with 0 failures
 Completed [==========================================>-----------------------------]  60% with 0 failures
 Completed [===========================================>----------------------------]  60% with 0 failures
 Completed [===========================================>----------------------------]  61% with 0 failures
 Completed [===========================================>----------------------------]  62% with 0 failures
 Completed [============================================>---------------------------]  62% with 0 failures
 Completed [============================================>---------------------------]  63% with 0 failures
 Completed [=============================================>--------------------------]  63% with 0 failures
 Completed [=============================================>--------------------------]  64% with 0 failures
 Completed [=============================================>--------------------------]  65% with 0 failures
 Completed [==============================================>-------------------------]  65% with 0 failures
 Completed [==============================================>-------------------------]  66% with 0 failures
 Completed [===============================================>------------------------]  66% with 0 failures
 Completed [===============================================>------------------------]  67% with 0 failures
 Completed [================================================>-----------------------]  67% with 0 failures
 Completed [================================================>-----------------------]  68% with 0 failures
 Completed [================================================>-----------------------]  69% with 0 failures
 Completed [=================================================>----------------------]  69% with 0 failures
 Completed [=================================================>----------------------]  70% with 0 failures
 Completed [==================================================>---------------------]  70% with 0 failures
 Completed [==================================================>---------------------]  71% with 0 failures
 Completed [===================================================>--------------------]  72% with 0 failures
 Completed [===================================================>--------------------]  73% with 0 failures
 Completed [====================================================>-------------------]  73% with 0 failures
 Completed [====================================================>-------------------]  74% with 0 failures
 Completed [=====================================================>------------------]  74% with 0 failures
 Completed [=====================================================>------------------]  75% with 0 failures
 Completed [=====================================================>------------------]  76% with 0 failures
 Completed [======================================================>-----------------]  76% with 0 failures
 Completed [======================================================>-----------------]  77% with 0 failures
 Completed [=======================================================>----------------]  77% with 0 failures
 Completed [=======================================================>----------------]  78% with 0 failures
 Completed [========================================================>---------------]  79% with 0 failures
 Completed [========================================================>---------------]  80% with 0 failures
 Completed [=========================================================>--------------]  80% with 0 failures
 Completed [=========================================================>--------------]  81% with 0 failures
 Completed [==========================================================>-------------]  81% with 0 failures
 Completed [==========================================================>-------------]  82% with 0 failures
 Completed [==========================================================>-------------]  83% with 0 failures
 Completed [===========================================================>------------]  83% with 0 failures
 Completed [===========================================================>------------]  84% with 0 failures
 Completed [============================================================>-----------]  84% with 0 failures
 Completed [============================================================>-----------]  85% with 0 failures
 Completed [=============================================================>----------]  85% with 0 failures
 Completed [=============================================================>----------]  86% with 0 failures
 Completed [=============================================================>----------]  87% with 0 failures
 Completed [==============================================================>---------]  87% with 0 failures
 Completed [==============================================================>---------]  88% with 0 failures
 Completed [===============================================================>--------]  88% with 0 failures
 Completed [===============================================================>--------]  89% with 0 failures
 Completed [===============================================================>--------]  90% with 0 failures
 Completed [================================================================>-------]  90% with 0 failures
 Completed [================================================================>-------]  91% with 0 failures
 Completed [=================================================================>------]  91% with 0 failures
 Completed [=================================================================>------]  92% with 0 failures
 Completed [==================================================================>-----]  92% with 0 failures
 Completed [==================================================================>-----]  93% with 0 failures
 Completed [==================================================================>-----]  94% with 0 failures
 Completed [===================================================================>----]  94% with 0 failures
 Completed [===================================================================>----]  95% with 0 failures
 Completed [====================================================================>---]  95% with 0 failures
 Completed [====================================================================>---]  96% with 0 failures
 Completed [====================================================================>---]  97% with 0 failures
 Completed [=====================================================================>--]  97% with 0 failures
 Completed [=====================================================================>--]  98% with 0 failures
 Completed [======================================================================>-]  98% with 0 failures
 Completed [======================================================================>-]  99% with 0 failures
 Completed [=======================================================================>]  99% with 0 failures
 Completed [=======================================================================>] 100% with 0 failures
 Completed [========================================================================] 100% with 0 failures
                                                                                                          

Done!
fd4_markers <- fd4_markers[fd4_markers$p_val_adj < 0.05, ]
head(fd4_markers, n = 15)
fd4_markers_annotated <- merge(gene_annotations, fd4_markers, by.x = "Gene.ID", by.y = 0)
View(fd4_markers_annotated)

save results of DE into excel

library(xlsx)
write.xlsx(md3_markers_annotated, file="../data_to_export/DE_analysis.xlsx", sheetName="md3", row.names=FALSE)
write.xlsx(md4_markers_annotated, file="../data_to_export/DE_analysis.xlsx", sheetName="md4", append=TRUE, row.names=FALSE)
write.xlsx(md5_markers_annotated, file="../data_to_export/DE_analysis.xlsx", sheetName="md5", append=TRUE, row.names=FALSE)
write.xlsx(gd1_markers_annotated, file="../data_to_export/DE_analysis.xlsx", sheetName="gd1", append=TRUE, row.names=FALSE)
write.xlsx(fd1_markers_annotated, file="../data_to_export/DE_analysis.xlsx", sheetName="fd1", append=TRUE, row.names=FALSE)
write.xlsx(fd2_markers_annotated, file="../data_to_export/DE_analysis.xlsx", sheetName="fd2", append=TRUE, row.names=FALSE)
write.xlsx(fd3_markers_annotated, file="../data_to_export/DE_analysis.xlsx", sheetName="fd3", append=TRUE, row.names=FALSE)
write.xlsx(fd4_markers_annotated, file="../data_to_export/DE_analysis.xlsx", sheetName="fd4", append=TRUE, row.names=FALSE)

how many DE genes per condition?

dim(md3_markers_annotated)[1]
[1] 19
dim(md4_markers_annotated)[1]
[1] 258
dim(md5_markers_annotated)[1]
[1] 103
dim(gd1_markers_annotated)[1]
[1] 250
dim(fd1_markers_annotated)[1]
[1] 149
dim(fd2_markers_annotated)[1]
[1] 1566
dim(fd3_markers_annotated)[1]
[1] 48
dim(fd4_markers_annotated)[1]
[1] 34

with filters of 2 fold change up or down (e.g. 0.5 > logFC > 1)

dim(md3_markers_annotated[md3_markers_annotated$avg_logFC > 1 | md3_markers_annotated$avg_logFC < 0.5, ])[1]
[1] 18
dim(md4_markers_annotated[md4_markers_annotated$avg_logFC > 1 | md4_markers_annotated$avg_logFC < 0.5, ])[1]
[1] 228
dim(md5_markers_annotated[md5_markers_annotated$avg_logFC > 1 | md5_markers_annotated$avg_logFC < 0.5, ])[1]
[1] 81
dim(gd1_markers_annotated[gd1_markers_annotated$avg_logFC > 1 | gd1_markers_annotated$avg_logFC < 0.5, ])[1]
[1] 191
dim(fd1_markers_annotated[fd1_markers_annotated$avg_logFC > 1 | fd1_markers_annotated$avg_logFC < 0.5, ])[1]
[1] 102
dim(fd2_markers_annotated[fd2_markers_annotated$avg_logFC > 1 | fd2_markers_annotated$avg_logFC < 0.5, ])[1]
[1] 1190
dim(fd3_markers_annotated[fd3_markers_annotated$avg_logFC > 1 | fd3_markers_annotated$avg_logFC < 0.5, ])[1]
[1] 38
dim(fd4_markers_annotated[fd4_markers_annotated$avg_logFC > 1 | fd4_markers_annotated$avg_logFC < 0.5, ])[1]
[1] 29

filter

md3_markers_annotated_filtered <- md3_markers_annotated[md3_markers_annotated$avg_logFC > 1 | md3_markers_annotated$avg_logFC < 0.5, ]
md4_markers_annotated_filtered <- md4_markers_annotated[md4_markers_annotated$avg_logFC > 1 | md4_markers_annotated$avg_logFC < 0.5, ]
md5_markers_annotated_filtered <- md5_markers_annotated[md5_markers_annotated$avg_logFC > 1 | md5_markers_annotated$avg_logFC < 0.5, ]
gd1_markers_annotated_filtered <- gd1_markers_annotated[gd1_markers_annotated$avg_logFC > 1 | gd1_markers_annotated$avg_logFC < 0.5, ]
fd1_markers_annotated_filtered <- fd1_markers_annotated[fd1_markers_annotated$avg_logFC > 1 | fd1_markers_annotated$avg_logFC < 0.5, ]
fd2_markers_annotated_filtered <- fd2_markers_annotated[fd2_markers_annotated$avg_logFC > 1 | fd2_markers_annotated$avg_logFC < 0.5, ]
fd3_markers_annotated_filtered <- fd3_markers_annotated[fd3_markers_annotated$avg_logFC > 1 | fd3_markers_annotated$avg_logFC < 0.5, ]
fd4_markers_annotated_filtered <- fd4_markers_annotated[fd4_markers_annotated$avg_logFC > 1 | fd4_markers_annotated$avg_logFC < 0.5, ]

basic venn

library(ggvenn)
## set up palette
## there are 8 DE genotypes 
qualitative_hcl(8, palette = "Pastel 1")
[1] "#FFC5D0" "#F2CDB2" "#D4D8A7" "#AFE0B9" "#99E2D8" "#ABDBF3" "#D5D0FC" "#F5C6EE"
## make lists 
a <- list(`md3` = md3_markers_annotated_filtered$Gene.ID,
          `md4` = md4_markers_annotated_filtered$Gene.ID,
          `md5` = md5_markers_annotated_filtered$Gene.ID,
          `gd1` = gd1_markers_annotated_filtered$Gene.ID)
## plot
venn_male_md3 <- ggvenn(a, 
       c("md3", "md4", "md5", "gd1"),
       fill_color = c(qualitative_hcl(8, palette = "Pastel 1")[1], qualitative_hcl(8, palette = "Pastel 1")[2], qualitative_hcl(8, palette = "Pastel 1")[3], qualitative_hcl(8, palette = "Pastel 1")[4]),
       stroke_size = 0.5, set_name_size = 4,show_percentage = FALSE,
       fill_alpha = 0.5
       ) 
venn_male_md3

save

ggsave("../images_to_export/venn_male_md3.png", plot = venn_male_md3, device = "png", path = NULL, scale = 1, width = 5, height = 5, units = "cm", dpi = 300, limitsize = TRUE)
library("colorspace")
## make lists 
a <- list(`md4` = md4_markers_annotated_filtered$Gene.ID,
          `md5` = md5_markers_annotated_filtered$Gene.ID,
          `gd1` = gd1_markers_annotated_filtered$Gene.ID)
## plot
venn_male <- ggvenn(a, 
       c("md4", "md5", "gd1"),
       fill_color = c(qualitative_hcl(8, palette = "Pastel 1")[2], qualitative_hcl(8, palette = "Pastel 1")[3], qualitative_hcl(8, palette = "Pastel 1")[4]),
       stroke_size = 0.5, 
       set_name_size = 4,
       show_percentage = FALSE,
       fill_alpha = 0.5
       )
venn_male

save

ggsave("../images_to_export/venn_male.png", plot = venn_male, device = "png", path = NULL, scale = 1, width = 5, height = 5, units = "cm", dpi = 300, limitsize = TRUE)
library("colorspace")
## make lists 
a <- list(`fd1` = fd1_markers_annotated_filtered$Gene.ID,
          `fd2` = fd2_markers_annotated_filtered$Gene.ID,
          `fd3` = fd3_markers_annotated_filtered$Gene.ID,
          `fd4` = fd4_markers_annotated_filtered$Gene.ID)
## plot
venn_female <- ggvenn(a, 
       #c("fd1", "fd2", "fd3", "fd4"),
       fill_color = c(qualitative_hcl(8, palette = "Pastel 1")[5], qualitative_hcl(8, palette = "Pastel 1")[6], qualitative_hcl(8, palette = "Pastel 1")[7], qualitative_hcl(8, palette = "Pastel 1")[8]),
       stroke_size = 0.5, 
       set_name_size = 4,
       show_percentage = FALSE,
       fill_alpha = 0.5
       )
venn_female

save

ggsave("../images_to_export/venn_female.png", plot = venn_female, device = "png", path = NULL, scale = 1, width = 5, height = 5, units = "cm", dpi = 300, limitsize = TRUE)

DE comparison figures

## make list of genotypes
list_of_genotypes <- unique(tenx.mutant.integrated.sex@meta.data$identity_combined)
## redorder for better plotting and remove wt, md1, and md2
list_of_genotypes <- list_of_genotypes[c(11, 7, 8, 12, 5, 10, 6, 9)]
## make a list of clusters to highlight for each genotype
list_of_clusters <- list(c("4"), c("12"), c("10"), c("12"), c("8"), c("15", "8"), c("0"), c("0"))

## make a blank list for plots
list_plots_de_highlight <- vector(mode = "list", length = length(list_of_genotypes))

## make pal
pal_de <- c(diverging_hcl(2, palette = "Berlin")[2],"#E2E2E2", diverging_hcl(2, palette = "Berlin")[1])

## for loop
for(i in seq_along(list_of_genotypes)){
    ## make a list of cells to highlight - but for wild-type, include all cells of that genotype, not just ones excluded for sex ratio
  umap_tx = tenx.mutant.integrated.sex@reductions[["DIM_PCA"]]@cell.embeddings
  umap_tx <- merge(umap_tx, tenx.mutant.integrated.sex@meta.data[,c("seurat_clusters", "identity_combined")], by=0, all=TRUE)
  ## make a new blank column
  umap_tx$col <- "not-profiled"
  ## add colours for each highlighted class
  umap_tx[umap_tx$seurat_clusters == list_of_clusters[[i]] & umap_tx$identity_combined == c("wild-type (10x)","wild-type (Smart-seq2)"), ]$col <- "wild-type"
  umap_tx[umap_tx$seurat_clusters == list_of_clusters[[i]] & umap_tx$identity_combined == list_of_genotypes[i], ]$col <- "mutant"
  ## make a size column 
  #umap_tx[umap_tx$col == "not-profiled", ]$pt_size <- "small"
  #umap_tx[umap_tx$col == "wild-type" | umap_tx$col == "mutant", ]$pt_size <- "big"
  ## order cells so that profiled cells are plotted last
  umap_tx <- rbind(umap_tx[umap_tx$col == "not-profiled", ], umap_tx[umap_tx$col == "wild-type", ], umap_tx[umap_tx$col == "mutant", ])
  ## make a plot
  pca_plot <- ggplot(umap_tx, aes(x = DIMPCA_1, y = DIMPCA_2)) +
              geom_point(aes(color = col, size = col, alpha = col)) +
              scale_colour_manual(values=pal_de) +
              scale_size_manual(values=c(3, 1, 3)) +
              scale_alpha_manual(values=c(0.5, 1, 0.5)) +
              coord_fixed() +
              theme_void() + 
              labs(title = paste(list_of_genotypes[i])) + 
              theme(plot.title = element_text(hjust = 0.5, family="Arial", size = 15, face = "bold.italic"), legend.position = "none")
  ## add to the list
  list_plots_de_highlight[[i]] <- pca_plot
}

plot

## this function writes the next bit of code for you
## put it into the console and paste the response
#ploty <- c()
#for(i in seq_along(list_of_genotypes)){
#  ploty <- paste0(ploty, "list_plots_sex_highlight[[", i, "]]", " + ")
#}

## plot
composite_cell_locations <- plot_grid(list_plots_de_highlight[[1]], 
                                      list_plots_de_highlight[[2]], 
                                      list_plots_de_highlight[[3]], 
                                      list_plots_de_highlight[[4]], 
                                      list_plots_de_highlight[[5]], 
                                      list_plots_de_highlight[[6]], 
                                      list_plots_de_highlight[[7]], 
                                      list_plots_de_highlight[[8]], 
                                      nrow = 2)

composite_cell_locations

save

ggsave("../images_to_export/ALLCELLS_de_cell_locations.png", plot = composite_cell_locations, device = "png", path = NULL, scale = 1, width = 20, height = 10, units = "cm", dpi = 300, limitsize = TRUE)

Assessing DE genes

## make a list of dataframes so one can run for loops on these
list_of_DE_gene_lists <- 

Run tSNE

tenx.mutant.integrated.sex <- RunTSNE(tenx.mutant.integrated.sex, seed.use = 1234, perplexity = 200)
DimPlot(tenx.mutant.integrated.sex, reduction = "tsne", pt.size = 0.01, label = TRUE)

B. UMAP

calculate UMAP

## run UMAP
#tenx.mutant.integrated.sex <- RunUMAP(tenx.mutant.integrated.sex, reduction = "pca", dims = 1:15, n.neighbors = 20, seed.use = 1234, min.dist = 0.5, repulsion.strength = 0.05, reduction.name = "umapoptimised_post_repca")

tenx.mutant.integrated.sex <- RunUMAP(tenx.mutant.integrated.sex, reduction = "pca", dims = 1:11, seed.use = 1234, n.neighbors = 10, reduction.name = "umapoptimised_post_repca", reduction.key='umap_post_repca_')

## plot
DimPlot(tenx.mutant.integrated.sex, reduction = "umapoptimised_post_repca", label = TRUE, repel = TRUE, label.size = 5, pt.size = 0.5, group.by = "identity_combined") +
  coord_fixed() +
  theme_void() +
  theme(legend.position = "bottom") +
  guides(colour=guide_legend(nrow=3,byrow=TRUE, override.aes = list(size=4)))

DimPlot(tenx.mutant.integrated.sex, reduction = "umapoptimised_post_repca", label = TRUE, repel = TRUE, label.size = 5, pt.size = 0.5, split.by = "genotype_combined") +
  coord_fixed() +
  theme_void() +
  theme(legend.position = "bottom") +
  guides(colour=guide_legend(nrow=3,byrow=TRUE, override.aes = list(size=4)))

DimPlot(tenx.mutant.integrated.sex, reduction = "umapoptimised_post_repca", label = TRUE, repel = TRUE, label.size = 5, pt.size = 0.5, split.by = "experiment", group.by = "identity_combined") +
  coord_fixed() +
  theme_void() +
  theme(legend.position = "bottom") +
  guides(colour=guide_legend(nrow=3,byrow=TRUE, override.aes = list(size=4)))

FeaturePlot(tenx.mutant.integrated.sex, reduction = "umapoptimised_post_repca", pt.size = 0.01, features = "PBANKA-1319500") + coord_fixed()

check markers to orientate

DimPlot(mutant_only_seurat, label = TRUE, label.size = 8, repel = FALSE, pt.size = 0.5, dims = c(2,1), reduction = "DIM_UMAP") + 
     coord_fixed() +
     theme(legend.position="bottom", 
           axis.line=element_blank(),
           axis.text.x=element_blank(),
           axis.text.y=element_blank(),
           axis.ticks=element_blank(),
           axis.title.x=element_blank(),
           axis.title.y=element_blank()) + 
     guides(colour=guide_legend(nrow = 3, byrow = TRUE, override.aes = list(size=5)))

inspect mutants in 13 that are in between sexes

## get mutant cells
mutant_sex_cells <- rownames(tenx.mutant.integrated.sex@meta.data[which(tenx.mutant.integrated.sex@meta.data$genotype_combined == "Mutant"),])
                                                        
## subset object
mutant_only_seurat <- subset(tenx.mutant.integrated.sex, cells = mutant_sex_cells)

## plot
umap_mutant <- DimPlot(mutant_only_seurat, reduction = "umapoptimised_post_repca", label = TRUE, repel = TRUE, label.size = 5, pt.size = 0.5) +
  coord_fixed() +
  theme_void() +
  theme(legend.position = "bottom") +
  guides(colour=guide_legend(nrow=3,byrow=TRUE, override.aes = list(size=4)))

## view
HoverLocator(plot = umap_mutant, information = FetchData(mutant_only_seurat, vars = c("ident", "identity_updated", "nFeature_RNA", "identity_combined")))
DimPlot(mutant_only_seurat, label = TRUE, label.size = 8, repel = FALSE, pt.size = 0.5, dims = c(2,1), reduction = "DIM_UMAP") + 
     coord_fixed() +
     theme(legend.position="bottom", 
           axis.line=element_blank(),
           axis.text.x=element_blank(),
           axis.text.y=element_blank(),
           axis.ticks=element_blank(),
           axis.title.x=element_blank(),
           axis.title.y=element_blank()) + 
     guides(colour=guide_legend(nrow = 3, byrow = TRUE, override.aes = list(size=5)))

4. Clustering

Investigate sub clustering of pre-branch clusters

Ultimately, we are looking for coexpression after the expression of AP2G:

## plot
marker_gene_plot_AP2G <- FeaturePlot(tenx.mutant.integrated.sex, features = "PBANKA-1437500", coord.fixed = TRUE, min.cutoff = "q1", dims = c(2,1), reduction = "DIM_UMAP", pt.size = 1, order = TRUE) + 
  theme_void() + 
  labs(title = paste("AP2G Expression")) + 
  theme(plot.title = element_text(hjust = 0.5, family="Arial", size = 20, face = "bold")) + 
  scale_colour_gradientn(colours=c("#DCDCDC", plasma(30)))

##view
marker_gene_plot_AP2G

and we have the following clusters currently:

## Plot
umap_cluster <- DimPlot(tenx.mutant.integrated.sex, label = TRUE, label.size = 8, repel = FALSE, pt.size = 0.5, dims = c(2,1), reduction = "DIM_UMAP") + 
  coord_fixed() +
  theme(legend.position="bottom", 
        axis.line=element_blank(),
        axis.text.x=element_blank(),
        axis.text.y=element_blank(),
        axis.ticks=element_blank(),
        axis.title.x=element_blank(),
        axis.title.y=element_blank()) + 
  guides(colour=guide_legend(nrow = 3, byrow = TRUE, override.aes = list(size=5)))

## print
umap_cluster

11 is the common sex branch so we will interrogate that branch

## subset cluster 13 cells
cells_bipot <- rownames(tenx.mutant.integrated.sex@meta.data[tenx.mutant.integrated.sex@meta.data$seurat_clusters == 11 & tenx.mutant.integrated.sex@meta.data$genotype_combined == "WT", ])

## subset cluster 13
seurat_bipot <- subset(tenx.mutant.integrated.sex, cells = cells_bipot)
seurat_bipot

## re-PCA
seurat_bipot <- RunPCA(seurat_bipot, npcs = 30, verbose = FALSE)
ElbowPlot(seurat_bipot, ndims = 30, reduction = "pca")

## recluster
seurat_bipot <- FindNeighbors(seurat_bipot, dims = 1:15)
seurat_bipot <- FindClusters(seurat_bipot, resolution = 1, random.seed = 42, algorithm = 2)
DimPlot(seurat_bipot, reduction = "pca",  dims = c(2,1), label = TRUE, repel = TRUE, label.size = 5, pt.size = 0.5, group.by = "seurat_clusters") 

## plot cluster resolution = 1
## plot
DimPlot(seurat_bipot, reduction = "DIM_UMAP",  dims = c(2,1), label = TRUE, repel = TRUE, label.size = 5, pt.size = 0.5, group.by = "seurat_clusters") +
  coord_fixed() +
  theme_void() +
  theme(legend.position = "bottom") +
  guides(colour=guide_legend(nrow=3,byrow=TRUE, override.aes = list(size=4)))

2 and 1 are superimposed on the branch, lets find markers for each cluster


# PBANKA-0828000         GCSKO-3  GD1

# PBANKA-1302700       GCSKO-oom  MD1 
# PBANKA-1447900        GCSKO-29  MD2
# PBANKA-0102400         GCSKO-2  MD3 
# PBANKA-0716500        GCSKO-19  MD4 
# PBANKA-0413400    GCSKO-10_820  MD5

# PBANKA-1454800        GCSKO-21  FD1
# PBANKA-0902300        GCSKO-13  FD2
# PBANKA-1418100        GCSKO-17  FD3   
# PBANKA-1435200        GCSKO-20  FD4 

# PBANKA-1437500 - AP2G - commitment

## find markers
seurat_bipot_markers <- FindAllMarkers(seurat_bipot, only.pos = FALSE, min.pct = 0.25, logfc.threshold = 0.25, test.use = "MAST")

## inspect result
markers_subset <- seurat_bipot_markers %>% group_by(cluster) %>% top_n(n = 50, wt = avg_logFC) %>% filter(p_val_adj < 0.05)
markers_subset <- markers_subset[order(-markers_subset$avg_logFC), ]
markers_subset

## find markers
markers_subset_mutant <- markers_subset[which(markers_subset$gene %in% list_of_mutant_genes), ]
markers_subset_mutant

## plot
VlnPlot(seurat_bipot, features = c(markers_subset_mutant$gene, "PBANKA-1437500"), assay = "RNA")

Specifically look for markers between 0 and 2

cluster_1_2_markers <- FindMarkers(seurat_bipot, ident.1 = 0, ident.2 = 2, only.pos = FALSE, min.pct = 0.25, logfc.threshold = 0.25)

cluster_1_2_markers_subset <- cluster_1_2_markers %>% filter(p_val_adj < 0.05)
cluster_1_2_markers_subset <- cluster_1_2_markers_subset[order(-cluster_1_2_markers_subset$avg_logFC), ]
cluster_1_2_markers_subset
## this is no longer needed as only wild-type cells are chosen.
## Just check that mutants aren't interfering  with the analysis i.e. the clusters don't just belong to a certain genotype or mutant cell
#table(seurat_bipot$seurat_clusters, seurat_bipot$identity_combined)

Do the same analysis on cluster 5 quickly

## find markers
cells_three_markers <- FindAllMarkers(cells_three, only.pos = FALSE, min.pct = 0.25, logfc.threshold = 0.25)
Calculating cluster 0

  |                                                  | 0 % ~calculating  
  |+                                                 | 2 % ~00s          
  |++                                                | 4 % ~00s          
  |+++                                               | 6 % ~00s          
  |++++                                              | 8 % ~00s          
  |+++++                                             | 9 % ~00s          
  |++++++                                            | 11% ~00s          
  |+++++++                                           | 13% ~00s          
  |++++++++                                          | 15% ~00s          
  |+++++++++                                         | 17% ~00s          
  |++++++++++                                        | 19% ~00s          
  |+++++++++++                                       | 21% ~00s          
  |++++++++++++                                      | 23% ~00s          
  |+++++++++++++                                     | 25% ~00s          
  |++++++++++++++                                    | 26% ~00s          
  |+++++++++++++++                                   | 28% ~00s          
  |++++++++++++++++                                  | 30% ~00s          
  |+++++++++++++++++                                 | 32% ~00s          
  |+++++++++++++++++                                 | 34% ~00s          
  |++++++++++++++++++                                | 36% ~00s          
  |+++++++++++++++++++                               | 38% ~00s          
  |++++++++++++++++++++                              | 40% ~00s          
  |+++++++++++++++++++++                             | 42% ~00s          
  |++++++++++++++++++++++                            | 43% ~00s          
  |+++++++++++++++++++++++                           | 45% ~00s          
  |++++++++++++++++++++++++                          | 47% ~00s          
  |+++++++++++++++++++++++++                         | 49% ~00s          
  |++++++++++++++++++++++++++                        | 51% ~00s          
  |+++++++++++++++++++++++++++                       | 53% ~00s          
  |++++++++++++++++++++++++++++                      | 55% ~00s          
  |+++++++++++++++++++++++++++++                     | 57% ~00s          
  |++++++++++++++++++++++++++++++                    | 58% ~00s          
  |+++++++++++++++++++++++++++++++                   | 60% ~00s          
  |++++++++++++++++++++++++++++++++                  | 62% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~00s          
  |++++++++++++++++++++++++++++++++++                | 66% ~00s          
  |++++++++++++++++++++++++++++++++++                | 68% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=00s  
Calculating cluster 1

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~00s          
  |++                                                | 3 % ~00s          
  |+++                                               | 4 % ~00s          
  |+++                                               | 6 % ~00s          
  |++++                                              | 7 % ~00s          
  |+++++                                             | 9 % ~00s          
  |+++++                                             | 10% ~00s          
  |++++++                                            | 11% ~00s          
  |+++++++                                           | 13% ~00s          
  |++++++++                                          | 14% ~00s          
  |++++++++                                          | 16% ~00s          
  |+++++++++                                         | 17% ~00s          
  |++++++++++                                        | 19% ~00s          
  |++++++++++                                        | 20% ~00s          
  |+++++++++++                                       | 21% ~00s          
  |++++++++++++                                      | 23% ~00s          
  |+++++++++++++                                     | 24% ~00s          
  |+++++++++++++                                     | 26% ~00s          
  |++++++++++++++                                    | 27% ~00s          
  |+++++++++++++++                                   | 29% ~00s          
  |+++++++++++++++                                   | 30% ~00s          
  |++++++++++++++++                                  | 31% ~00s          
  |+++++++++++++++++                                 | 33% ~00s          
  |++++++++++++++++++                                | 34% ~00s          
  |++++++++++++++++++                                | 36% ~00s          
  |+++++++++++++++++++                               | 37% ~00s          
  |++++++++++++++++++++                              | 39% ~00s          
  |++++++++++++++++++++                              | 40% ~00s          
  |+++++++++++++++++++++                             | 41% ~00s          
  |++++++++++++++++++++++                            | 43% ~00s          
  |+++++++++++++++++++++++                           | 44% ~00s          
  |+++++++++++++++++++++++                           | 46% ~00s          
  |++++++++++++++++++++++++                          | 47% ~00s          
  |+++++++++++++++++++++++++                         | 49% ~00s          
  |+++++++++++++++++++++++++                         | 50% ~00s          
  |++++++++++++++++++++++++++                        | 51% ~00s          
  |+++++++++++++++++++++++++++                       | 53% ~00s          
  |++++++++++++++++++++++++++++                      | 54% ~00s          
  |++++++++++++++++++++++++++++                      | 56% ~00s          
  |+++++++++++++++++++++++++++++                     | 57% ~00s          
  |++++++++++++++++++++++++++++++                    | 59% ~00s          
  |++++++++++++++++++++++++++++++                    | 60% ~00s          
  |+++++++++++++++++++++++++++++++                   | 61% ~00s          
  |++++++++++++++++++++++++++++++++                  | 63% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~00s          
  |++++++++++++++++++++++++++++++++++                | 67% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01s  
Calculating cluster 2

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01s          
  |++                                                | 2 % ~01s          
  |++                                                | 4 % ~01s          
  |+++                                               | 5 % ~01s          
  |++++                                              | 6 % ~01s          
  |++++                                              | 7 % ~01s          
  |+++++                                             | 9 % ~01s          
  |+++++                                             | 10% ~01s          
  |++++++                                            | 11% ~01s          
  |+++++++                                           | 12% ~01s          
  |+++++++                                           | 14% ~01s          
  |++++++++                                          | 15% ~01s          
  |+++++++++                                         | 16% ~01s          
  |+++++++++                                         | 17% ~01s          
  |++++++++++                                        | 19% ~01s          
  |++++++++++                                        | 20% ~01s          
  |+++++++++++                                       | 21% ~01s          
  |++++++++++++                                      | 22% ~01s          
  |++++++++++++                                      | 23% ~01s          
  |+++++++++++++                                     | 25% ~01s          
  |+++++++++++++                                     | 26% ~01s          
  |++++++++++++++                                    | 27% ~01s          
  |+++++++++++++++                                   | 28% ~01s          
  |+++++++++++++++                                   | 30% ~01s          
  |++++++++++++++++                                  | 31% ~01s          
  |+++++++++++++++++                                 | 32% ~01s          
  |+++++++++++++++++                                 | 33% ~01s          
  |++++++++++++++++++                                | 35% ~01s          
  |++++++++++++++++++                                | 36% ~01s          
  |+++++++++++++++++++                               | 37% ~01s          
  |++++++++++++++++++++                              | 38% ~01s          
  |++++++++++++++++++++                              | 40% ~01s          
  |+++++++++++++++++++++                             | 41% ~01s          
  |+++++++++++++++++++++                             | 42% ~01s          
  |++++++++++++++++++++++                            | 43% ~01s          
  |+++++++++++++++++++++++                           | 44% ~01s          
  |+++++++++++++++++++++++                           | 46% ~01s          
  |++++++++++++++++++++++++                          | 47% ~01s          
  |+++++++++++++++++++++++++                         | 48% ~01s          
  |+++++++++++++++++++++++++                         | 49% ~01s          
  |++++++++++++++++++++++++++                        | 51% ~01s          
  |++++++++++++++++++++++++++                        | 52% ~01s          
  |+++++++++++++++++++++++++++                       | 53% ~01s          
  |++++++++++++++++++++++++++++                      | 54% ~01s          
  |++++++++++++++++++++++++++++                      | 56% ~01s          
  |+++++++++++++++++++++++++++++                     | 57% ~01s          
  |++++++++++++++++++++++++++++++                    | 58% ~01s          
  |++++++++++++++++++++++++++++++                    | 59% ~01s          
  |+++++++++++++++++++++++++++++++                   | 60% ~01s          
  |+++++++++++++++++++++++++++++++                   | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 63% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~00s          
  |++++++++++++++++++++++++++++++++++                | 67% ~00s          
  |++++++++++++++++++++++++++++++++++                | 68% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01s  
Calculating cluster 3

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01s          
  |++                                                | 2 % ~01s          
  |++                                                | 3 % ~01s          
  |+++                                               | 4 % ~01s          
  |+++                                               | 5 % ~01s          
  |++++                                              | 6 % ~01s          
  |++++                                              | 7 % ~01s          
  |+++++                                             | 8 % ~01s          
  |+++++                                             | 9 % ~01s          
  |++++++                                            | 10% ~01s          
  |++++++                                            | 11% ~01s          
  |+++++++                                           | 12% ~01s          
  |+++++++                                           | 14% ~01s          
  |++++++++                                          | 15% ~01s          
  |++++++++                                          | 16% ~01s          
  |+++++++++                                         | 17% ~01s          
  |+++++++++                                         | 18% ~01s          
  |++++++++++                                        | 19% ~01s          
  |++++++++++                                        | 20% ~01s          
  |+++++++++++                                       | 21% ~01s          
  |+++++++++++                                       | 22% ~01s          
  |++++++++++++                                      | 23% ~01s          
  |++++++++++++                                      | 24% ~01s          
  |+++++++++++++                                     | 25% ~01s          
  |++++++++++++++                                    | 26% ~01s          
  |++++++++++++++                                    | 27% ~01s          
  |+++++++++++++++                                   | 28% ~02s          
  |+++++++++++++++                                   | 29% ~02s          
  |++++++++++++++++                                  | 30% ~02s          
  |++++++++++++++++                                  | 31% ~02s          
  |+++++++++++++++++                                 | 32% ~01s          
  |+++++++++++++++++                                 | 33% ~01s          
  |++++++++++++++++++                                | 34% ~01s          
  |++++++++++++++++++                                | 35% ~01s          
  |+++++++++++++++++++                               | 36% ~01s          
  |+++++++++++++++++++                               | 38% ~01s          
  |++++++++++++++++++++                              | 39% ~01s          
  |++++++++++++++++++++                              | 40% ~01s          
  |+++++++++++++++++++++                             | 41% ~01s          
  |+++++++++++++++++++++                             | 42% ~01s          
  |++++++++++++++++++++++                            | 43% ~01s          
  |++++++++++++++++++++++                            | 44% ~01s          
  |+++++++++++++++++++++++                           | 45% ~01s          
  |+++++++++++++++++++++++                           | 46% ~01s          
  |++++++++++++++++++++++++                          | 47% ~01s          
  |++++++++++++++++++++++++                          | 48% ~01s          
  |+++++++++++++++++++++++++                         | 49% ~01s          
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |++++++++++++++++++++++++++                        | 51% ~01s          
  |+++++++++++++++++++++++++++                       | 52% ~01s          
  |+++++++++++++++++++++++++++                       | 53% ~01s          
  |++++++++++++++++++++++++++++                      | 54% ~01s          
  |++++++++++++++++++++++++++++                      | 55% ~01s          
  |+++++++++++++++++++++++++++++                     | 56% ~01s          
  |+++++++++++++++++++++++++++++                     | 57% ~01s          
  |++++++++++++++++++++++++++++++                    | 58% ~01s          
  |++++++++++++++++++++++++++++++                    | 59% ~01s          
  |+++++++++++++++++++++++++++++++                   | 60% ~01s          
  |+++++++++++++++++++++++++++++++                   | 61% ~01s          
  |++++++++++++++++++++++++++++++++                  | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 64% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |++++++++++++++++++++++++++++++++++                | 68% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02s  
## inspect result
markers_subset <- cells_three_markers %>% group_by(cluster) %>% top_n(n = 50, wt = avg_logFC) %>% filter(p_val_adj < 0.05)
markers_subset <- markers_subset[order(-markers_subset$avg_logFC), ]
markers_subset

## find markers
markers_subset_mutant <- markers_subset[which(markers_subset$gene %in% list_of_mutant_genes), ]
markers_subset_mutant

## plot
VlnPlot(cells_three, features = c(markers_subset_mutant$gene, "PBANKA-1437500"), assay = "RNA")

# PBANKA-0828000         GCSKO-3  GD1

# PBANKA-1302700       GCSKO-oom  MD1 
# PBANKA-1447900        GCSKO-29  MD2
# PBANKA-0102400         GCSKO-2  MD3 
# PBANKA-0716500        GCSKO-19  MD4 
# PBANKA-0413400    GCSKO-10_820  MD5

# PBANKA-1454800        GCSKO-21  FD1
# PBANKA-0902300        GCSKO-13  FD2
# PBANKA-1418100        GCSKO-17  FD3   
# PBANKA-1435200        GCSKO-20  FD4 

# PBANKA-1437500 - AP2G - commitment

## find markers
cells_three_markers <- FindAllMarkers(cells_three, only.pos = FALSE, min.pct = 0.25, logfc.threshold = 0.25)

## inspect result
markers_subset <- cells_three_markers %>% group_by(cluster) %>% top_n(n = 50, wt = avg_logFC) %>% filter(p_val_adj < 0.05)
markers_subset <- markers_subset[order(-markers_subset$avg_logFC), ]
markers_subset

## find markers
markers_subset_mutant <- markers_subset[which(markers_subset$gene %in% list_of_mutant_genes), ]
markers_subset_mutant

## plot
VlnPlot(cells_three, features = c(markers_subset_mutant$gene, "PBANKA-1437500"), assay = "RNA")
markers_subset_annotated <- merge(markers_subset, gene_annotations,  by.x = "gene", by.y = "Gene.ID", all = FALSE)
markers_subset_annotated

Cluster 2 contains the male cells as this has md1 and ap2g in it.

cluster 3 has histone h2b, histone 4, actin 1, so likley contains asexual cells

cluster 0 is potentially female as these genes have female-biased expression in the kasia data

cluster 1 genes were not screened so unknown identity

Then look at the co-expression of AP2-G and MD1

cluster_2_cells <- rownames(cells_three@meta.data[cells_three@meta.data$seurat_clusters == "2",])
cells_three_2 <- subset(cells_three, cells = cluster_2_cells)

df_plot <- data.frame(t(data.frame(cells_three_2@assays$RNA[c("PBANKA-1302700", "PBANKA-1437500"), ])))

ggplot(df_plot, aes(PBANKA.1302700, PBANKA.1437500)) + geom_point()

rm(cells_three_2)

Do the same on cluster 7

# PBANKA-0828000         GCSKO-3  GD1

# PBANKA-1302700       GCSKO-oom  MD1 
# PBANKA-1447900        GCSKO-29  MD2
# PBANKA-0102400         GCSKO-2  MD3 
# PBANKA-0716500        GCSKO-19  MD4 
# PBANKA-0413400    GCSKO-10_820  MD5

# PBANKA-1454800        GCSKO-21  FD1
# PBANKA-0902300        GCSKO-13  FD2
# PBANKA-1418100        GCSKO-17  FD3   
# PBANKA-1435200        GCSKO-20  FD4 

# PBANKA-1437500 - AP2G - commitment

## find markers
cells_seven_markers <- FindAllMarkers(cells_seven, only.pos = FALSE, min.pct = 0.25, logfc.threshold = 0.25)
Calculating cluster 0

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01s          
  |++                                                | 2 % ~01s          
  |++                                                | 3 % ~01s          
  |+++                                               | 5 % ~01s          
  |+++                                               | 6 % ~01s          
  |++++                                              | 7 % ~01s          
  |+++++                                             | 8 % ~01s          
  |+++++                                             | 9 % ~01s          
  |++++++                                            | 10% ~01s          
  |++++++                                            | 11% ~01s          
  |+++++++                                           | 13% ~01s          
  |+++++++                                           | 14% ~01s          
  |++++++++                                          | 15% ~01s          
  |+++++++++                                         | 16% ~01s          
  |+++++++++                                         | 17% ~01s          
  |++++++++++                                        | 18% ~01s          
  |++++++++++                                        | 20% ~01s          
  |+++++++++++                                       | 21% ~01s          
  |+++++++++++                                       | 22% ~01s          
  |++++++++++++                                      | 23% ~01s          
  |+++++++++++++                                     | 24% ~01s          
  |+++++++++++++                                     | 25% ~01s          
  |++++++++++++++                                    | 26% ~01s          
  |++++++++++++++                                    | 28% ~01s          
  |+++++++++++++++                                   | 29% ~01s          
  |+++++++++++++++                                   | 30% ~01s          
  |++++++++++++++++                                  | 31% ~01s          
  |+++++++++++++++++                                 | 32% ~01s          
  |+++++++++++++++++                                 | 33% ~01s          
  |++++++++++++++++++                                | 34% ~01s          
  |++++++++++++++++++                                | 36% ~01s          
  |+++++++++++++++++++                               | 37% ~01s          
  |+++++++++++++++++++                               | 38% ~01s          
  |++++++++++++++++++++                              | 39% ~01s          
  |+++++++++++++++++++++                             | 40% ~01s          
  |+++++++++++++++++++++                             | 41% ~01s          
  |++++++++++++++++++++++                            | 43% ~01s          
  |++++++++++++++++++++++                            | 44% ~01s          
  |+++++++++++++++++++++++                           | 45% ~01s          
  |+++++++++++++++++++++++                           | 46% ~01s          
  |++++++++++++++++++++++++                          | 47% ~01s          
  |+++++++++++++++++++++++++                         | 48% ~01s          
  |+++++++++++++++++++++++++                         | 49% ~01s          
  |++++++++++++++++++++++++++                        | 51% ~01s          
  |++++++++++++++++++++++++++                        | 52% ~01s          
  |+++++++++++++++++++++++++++                       | 53% ~00s          
  |++++++++++++++++++++++++++++                      | 54% ~00s          
  |++++++++++++++++++++++++++++                      | 55% ~00s          
  |+++++++++++++++++++++++++++++                     | 56% ~00s          
  |+++++++++++++++++++++++++++++                     | 57% ~00s          
  |++++++++++++++++++++++++++++++                    | 59% ~00s          
  |++++++++++++++++++++++++++++++                    | 60% ~00s          
  |+++++++++++++++++++++++++++++++                   | 61% ~00s          
  |++++++++++++++++++++++++++++++++                  | 62% ~00s          
  |++++++++++++++++++++++++++++++++                  | 63% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~00s          
  |++++++++++++++++++++++++++++++++++                | 67% ~00s          
  |++++++++++++++++++++++++++++++++++                | 68% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01s  
Calculating cluster 1

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~02s          
  |+                                                 | 2 % ~02s          
  |++                                                | 3 % ~02s          
  |++                                                | 4 % ~02s          
  |+++                                               | 5 % ~02s          
  |+++                                               | 6 % ~02s          
  |++++                                              | 7 % ~02s          
  |++++                                              | 8 % ~02s          
  |+++++                                             | 9 % ~02s          
  |+++++                                             | 10% ~02s          
  |++++++                                            | 11% ~02s          
  |++++++                                            | 12% ~02s          
  |+++++++                                           | 13% ~02s          
  |+++++++                                           | 14% ~02s          
  |++++++++                                          | 15% ~02s          
  |++++++++                                          | 16% ~02s          
  |+++++++++                                         | 17% ~02s          
  |+++++++++                                         | 18% ~02s          
  |++++++++++                                        | 19% ~02s          
  |++++++++++                                        | 20% ~02s          
  |+++++++++++                                       | 21% ~02s          
  |+++++++++++                                       | 22% ~02s          
  |++++++++++++                                      | 23% ~02s          
  |++++++++++++                                      | 24% ~02s          
  |+++++++++++++                                     | 25% ~02s          
  |+++++++++++++                                     | 26% ~02s          
  |++++++++++++++                                    | 27% ~02s          
  |++++++++++++++                                    | 28% ~02s          
  |+++++++++++++++                                   | 29% ~01s          
  |+++++++++++++++                                   | 30% ~01s          
  |++++++++++++++++                                  | 31% ~01s          
  |++++++++++++++++                                  | 32% ~01s          
  |+++++++++++++++++                                 | 33% ~01s          
  |+++++++++++++++++                                 | 34% ~01s          
  |++++++++++++++++++                                | 35% ~01s          
  |++++++++++++++++++                                | 36% ~01s          
  |+++++++++++++++++++                               | 37% ~01s          
  |+++++++++++++++++++                               | 38% ~01s          
  |++++++++++++++++++++                              | 39% ~01s          
  |++++++++++++++++++++                              | 40% ~01s          
  |+++++++++++++++++++++                             | 41% ~01s          
  |+++++++++++++++++++++                             | 42% ~01s          
  |++++++++++++++++++++++                            | 43% ~01s          
  |++++++++++++++++++++++                            | 44% ~01s          
  |+++++++++++++++++++++++                           | 45% ~01s          
  |+++++++++++++++++++++++                           | 46% ~01s          
  |++++++++++++++++++++++++                          | 47% ~01s          
  |++++++++++++++++++++++++                          | 48% ~01s          
  |+++++++++++++++++++++++++                         | 49% ~01s          
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |++++++++++++++++++++++++++                        | 51% ~01s          
  |++++++++++++++++++++++++++                        | 52% ~01s          
  |+++++++++++++++++++++++++++                       | 53% ~01s          
  |+++++++++++++++++++++++++++                       | 54% ~01s          
  |++++++++++++++++++++++++++++                      | 55% ~01s          
  |++++++++++++++++++++++++++++                      | 56% ~01s          
  |+++++++++++++++++++++++++++++                     | 57% ~01s          
  |+++++++++++++++++++++++++++++                     | 58% ~01s          
  |++++++++++++++++++++++++++++++                    | 59% ~01s          
  |++++++++++++++++++++++++++++++                    | 60% ~01s          
  |+++++++++++++++++++++++++++++++                   | 61% ~01s          
  |+++++++++++++++++++++++++++++++                   | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 63% ~01s          
  |++++++++++++++++++++++++++++++++                  | 64% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |++++++++++++++++++++++++++++++++++                | 68% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02s  
Calculating cluster 2

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01s          
  |++                                                | 2 % ~01s          
  |++                                                | 3 % ~01s          
  |+++                                               | 4 % ~01s          
  |+++                                               | 5 % ~01s          
  |++++                                              | 6 % ~01s          
  |++++                                              | 7 % ~01s          
  |+++++                                             | 8 % ~01s          
  |+++++                                             | 9 % ~01s          
  |++++++                                            | 10% ~01s          
  |++++++                                            | 11% ~01s          
  |+++++++                                           | 12% ~01s          
  |+++++++                                           | 13% ~01s          
  |++++++++                                          | 14% ~01s          
  |++++++++                                          | 15% ~01s          
  |+++++++++                                         | 16% ~01s          
  |+++++++++                                         | 17% ~01s          
  |++++++++++                                        | 18% ~01s          
  |++++++++++                                        | 19% ~01s          
  |+++++++++++                                       | 20% ~01s          
  |+++++++++++                                       | 21% ~01s          
  |++++++++++++                                      | 22% ~01s          
  |++++++++++++                                      | 23% ~01s          
  |+++++++++++++                                     | 24% ~01s          
  |+++++++++++++                                     | 25% ~01s          
  |++++++++++++++                                    | 26% ~01s          
  |++++++++++++++                                    | 27% ~01s          
  |+++++++++++++++                                   | 28% ~01s          
  |+++++++++++++++                                   | 29% ~01s          
  |++++++++++++++++                                  | 30% ~01s          
  |++++++++++++++++                                  | 31% ~01s          
  |+++++++++++++++++                                 | 32% ~01s          
  |+++++++++++++++++                                 | 33% ~01s          
  |++++++++++++++++++                                | 34% ~01s          
  |++++++++++++++++++                                | 35% ~01s          
  |+++++++++++++++++++                               | 36% ~01s          
  |+++++++++++++++++++                               | 37% ~01s          
  |++++++++++++++++++++                              | 38% ~01s          
  |++++++++++++++++++++                              | 39% ~01s          
  |+++++++++++++++++++++                             | 40% ~01s          
  |+++++++++++++++++++++                             | 41% ~01s          
  |++++++++++++++++++++++                            | 42% ~01s          
  |++++++++++++++++++++++                            | 43% ~01s          
  |+++++++++++++++++++++++                           | 44% ~01s          
  |+++++++++++++++++++++++                           | 45% ~01s          
  |++++++++++++++++++++++++                          | 46% ~01s          
  |++++++++++++++++++++++++                          | 47% ~01s          
  |+++++++++++++++++++++++++                         | 48% ~01s          
  |+++++++++++++++++++++++++                         | 49% ~01s          
  |++++++++++++++++++++++++++                        | 51% ~01s          
  |++++++++++++++++++++++++++                        | 52% ~01s          
  |+++++++++++++++++++++++++++                       | 53% ~01s          
  |+++++++++++++++++++++++++++                       | 54% ~01s          
  |++++++++++++++++++++++++++++                      | 55% ~01s          
  |++++++++++++++++++++++++++++                      | 56% ~01s          
  |+++++++++++++++++++++++++++++                     | 57% ~01s          
  |+++++++++++++++++++++++++++++                     | 58% ~01s          
  |++++++++++++++++++++++++++++++                    | 59% ~01s          
  |++++++++++++++++++++++++++++++                    | 60% ~01s          
  |+++++++++++++++++++++++++++++++                   | 61% ~01s          
  |+++++++++++++++++++++++++++++++                   | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 63% ~01s          
  |++++++++++++++++++++++++++++++++                  | 64% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~00s          
  |++++++++++++++++++++++++++++++++++                | 67% ~00s          
  |++++++++++++++++++++++++++++++++++                | 68% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02s  
## inspect result
markers_subset <- cells_seven_markers %>% group_by(cluster) %>% top_n(n = 50, wt = avg_logFC) %>% filter(p_val_adj < 0.05)
markers_subset <- markers_subset[order(-markers_subset$avg_logFC), ]
markers_subset

## find markers
markers_subset_mutant <- markers_subset[which(markers_subset$gene %in% list_of_mutant_genes), ]
markers_subset_mutant

## plot
#VlnPlot(cells_seven, features = c(markers_subset_mutant$gene, "PBANKA-1437500"), assay = "RNA")
# PBANKA-0828000         GCSKO-3  GD1

# PBANKA-1302700       GCSKO-oom  MD1 
# PBANKA-1447900        GCSKO-29  MD2
# PBANKA-0102400         GCSKO-2  MD3 
# PBANKA-0716500        GCSKO-19  MD4 
# PBANKA-0413400    GCSKO-10_820  MD5

# PBANKA-1454800        GCSKO-21  FD1
# PBANKA-0902300        GCSKO-13  FD2
# PBANKA-1418100        GCSKO-17  FD3   
# PBANKA-1435200        GCSKO-20  FD4 

# PBANKA-1437500 - AP2G - commitment

## find markers
cells_seven_markers <- FindAllMarkers(cells_seven, only.pos = FALSE, min.pct = 0.25, logfc.threshold = 0.25)

## inspect result
markers_subset <- cells_seven_markers %>% group_by(cluster) %>% top_n(n = 50, wt = avg_logFC) %>% filter(p_val_adj < 0.05)
markers_subset <- markers_subset[order(-markers_subset$avg_logFC), ]
markers_subset

## find markers
markers_subset_mutant <- markers_subset[which(markers_subset$gene %in% list_of_mutant_genes), ]
markers_subset_mutant

## plot
#VlnPlot(cells_seven, features = c(markers_subset_mutant$gene, "PBANKA-1437500"), assay = "RNA")

Visualise cells:

## define cells
slingshot_results_df <- as.data.frame(slingPseudotime(crv1))
curve_one_cells <- rownames(slingshot_results_df[!is.na(slingshot_results_df$curve1), ])
curve_two_cells <- rownames(slingshot_results_df[!is.na(slingshot_results_df$curve2), ])
curve_three_cells <- rownames(slingshot_results_df[!is.na(slingshot_results_df$curve3), ])
curve_four_cells <- rownames(slingshot_results_df[!is.na(slingshot_results_df$curve4), ])

c1_plot <- DimPlot(seurat.object, repel = TRUE, label.size = 5, pt.size = 0.5, cells.highlight = curve_one_cells, dims = c(2,1), reduction = "DIM_UMAP") +
  coord_fixed() + 
  scale_color_manual(values=c("#000000", "#f54e1e"))

c2_plot <- DimPlot(seurat.object, repel = TRUE, label.size = 5, pt.size = 0.5, cells.highlight = curve_two_cells, dims = c(2,1), reduction = "DIM_UMAP") +
  coord_fixed() + 
  scale_color_manual(values=c("#000000", "#f54e1e"))

c3_plot <- DimPlot(seurat.object, repel = TRUE, label.size = 5, pt.size = 0.5, cells.highlight = curve_three_cells, dims = c(2,1), reduction = "DIM_UMAP") +
  coord_fixed() + 
  scale_color_manual(values=c("#000000", "#f54e1e"))

c4_plot <- DimPlot(seurat.object, repel = TRUE, label.size = 5, pt.size = 0.5, cells.highlight = curve_four_cells, dims = c(2,1), reduction = "DIM_UMAP") +
  coord_fixed() + 
  scale_color_manual(values=c("#000000", "#f54e1e"))

plot_grid(c1_plot, c2_plot, c3_plot, c4_plot, labels = c('curve 1', 'curve 2', 'curve 3', 'curve 4'), label_size = 12, 
                                ncol = 2, 
                                nrow=2
                            
                )

Add data to Seurat:

## extract data to add to Seurat
## extract clusters
meta_data_to_add_from_slingshot <- data.frame(clusters_k_means_UMAP = clusters)
## Add pseudotimes
# check the length of each branch to see which curve is which using: sum(is.na(as.data.frame(slingPseudotime(crv1))$curve1))
# then inspect using the ggplot2 above to where males are - 
# tail(as.data.frame(slingPseudotime(crv1)), 100)
# tail(meta_data_to_add_from_slingshot, 100)
meta_data_to_add_from_slingshot$PT_Female_UMAP <- as.data.frame(slingPseudotime(crv1))$curve1
meta_data_to_add_from_slingshot$PT_Male_UMAP <- as.data.frame(slingPseudotime(crv1))$curve2
## add designation to SCE object
meta_data_to_add_from_slingshot$sex_UMAP <- "pre-det"
meta_data_to_add_from_slingshot$sex_UMAP[which(is.na(meta_data_to_add_from_slingshot$PT_Female_UMAP))] <- "male"
meta_data_to_add_from_slingshot$sex_UMAP[which(is.na(meta_data_to_add_from_slingshot$PT_Male_UMAP))] <- "female"

## if there are 3 curves in slingPseudotime(crv1):
#meta_data_to_add_from_slingshot$sex_UMAP[which(is.na(meta_data_to_add_from_slingshot$PT_Female_UMAP) & is.na(as.data.frame(slingPseudotime(crv1))$curve3))] <- "male"
#meta_data_to_add_from_slingshot$sex_UMAP[which(is.na(meta_data_to_add_from_slingshot$PT_Male_UMAP) & is.na(as.data.frame(slingPseudotime(crv1))$curve3))] <- "female"

## add clusters to SCE object
tenx.mutant.integrated.sex <- AddMetaData(tenx.mutant.integrated.sex, meta_data_to_add_from_slingshot)
## plot
FeaturePlot(tenx.mutant.integrated.sex, label.size = 5, pt.size = 0.5, features = c("PT_Female_UMAP", "PT_Male_UMAP")) +
  theme_void() +
  theme(legend.position = "bottom") +
  guides(colour=guide_legend(nrow=3,byrow=TRUE, override.aes = list(size=4)))

plot sex designations

DimPlot(tenx.mutant.integrated.sex, label = TRUE, repel = TRUE, label.size = 5, pt.size = 0.5, group.by = "sex_UMAP", na.value = "white") +
  coord_fixed() +
  theme_void() +
  theme(legend.position = "bottom") +
  guides(colour=guide_legend(nrow=3,byrow=TRUE, override.aes = list(size=4)))

6. Monocle on sex cells

calculate pseudotime and modules

Preparation

## extracts only 10x cells and also remove cluster 0 cells 
wt_cells <- rownames(tenx.mutant.integrated.sex@meta.data[which(tenx.mutant.integrated.sex@meta.data$identity_combined == "WT_10X" & !tenx.mutant.integrated.sex@meta.data$seurat_clusters == "7"),])

## make a new Seurat of this
seurat.object <-subset(tenx.mutant.integrated.sex, cells = wt_cells)

## check that this is the same as the pb_sex_filtered object
#data_test <- as(as.matrix(GetAssayData(pb_sex_filtered, assay = "RNA", slot = "data")), 'sparseMatrix')
#is.equal
#is.identical

## extract counts and pheno:
## the reason we use the integrated and then subsetted is because these cells have been normalised whereas the cells in pb_sex_filtered have not been normalised (well they have but with doublets in them)
## with 10x only cells: all.equal(as.data.frame(counts(monocle.object)), as.data.frame(as.matrix(GetAssayData(seurat.object, assay = "RNA", slot = "counts")))) returns TRUE and also returns true when you change the slot input to "counts" and use monocle to norm it with method "log"
data <- as(as.matrix(GetAssayData(seurat.object, assay = "RNA", slot = "data")), 'sparseMatrix')
## make phenodata
pd <- data.frame(seurat.object@meta.data)
## keep only the columns that are relevant in metadata
#pData <- pd %>% select(orig.ident, nCount_RNA, nFeature_RNA)
## make gene metadata
fData <- data.frame(gene_short_name = row.names(data), row.names = row.names(data))

## Construct monocle cds
monocle.object <- new_cell_data_set(expression_data = data, cell_metadata = pd, gene_metadata = fData)

## preprocess
monocle.object = preprocess_cds(monocle.object, num_dim = 50, norm_method = "none")
### if using integrated data:
# norm_method = "none", alignment_group = "~ experiment"

## plot jack straw plot
#plot_pc_variance_explained(monocle.object)

#monocle.object = reduce_dimension(monocle.object, reduction_method = "UMAP", preprocess_method = "PCA", umap.metric = "euclidean", umap.n_neighbors = 50, umap.min_dist = 0.5, verbose = FALSE)

#plot_cells(monocle.object, color_cells_by="experiment")

## graph learning

## add UMAP from Seurat
monocle.object@int_colData@listData$reducedDims@listData[["UMAP"]] <- seurat.object@reductions[["DIM_UMAP"]]@cell.embeddings
## if you want the old UMAP from the original all cells one, use: "DIM_UMAP"

## cluster
## this is essential to run the learn_graph function later on
monocle.object = cluster_cells(monocle.object)

## plot initial clustering by monocle
#plot_cells(monocle.object, color_cells_by="cluster", group_cells_by="partition", x = 2, y = 1)

## map pseudotime
monocle.object = learn_graph(monocle.object, learn_graph_control=list(ncenter=250, minimal_branch_len = 30), use_partition = FALSE)
# learn_graph_control=list(ncenter=500) - play with this parameter - lower tends to give fewer branches and higher tends to give more
# 500 - old analysis
# 250 - new analysis 

## Plot cells
plot_cells(monocle.object, color_cells_by="partition", group_cells_by="partition", x = 2, y = 1)

Define identities of cells

male

monocle.object_male <- choose_graph_segments(monocle.object)

female

monocle.object_female <- choose_graph_segments(monocle.object)

bipotential

monocle.object_bipot <- choose_graph_segments(monocle.object)

asexual

monocle.object_asex <- choose_graph_segments(monocle.object)

asexual fate

monocle.object_asex_fate <- choose_graph_segments(monocle.object)

check

df_freq <- data.frame(table(c(colnames(monocle.object_male), colnames(monocle.object_female), colnames(monocle.object_bipot), colnames(monocle.object_asex), colnames(monocle.object_asex_fate))))
paste("number of cells in seurat object is", length(colnames(monocle.object)), ". The number of cells selected here with an identitity is", dim(df_freq)[1])
df_freq <- df_freq[df_freq$Freq > 1, ]
df_freq

Inspect where these missing cells are:

'%ni%' <- Negate('%in%')

not_assigned_cells <- colnames(monocle.object)[colnames(monocle.object) %ni% c(colnames(monocle.object_male), colnames(monocle.object_female), colnames(monocle.object_bipot), colnames(monocle.object_asex), colnames(monocle.object_asex_fate))]

DimPlot(seurat.object, repel = TRUE, label.size = 5, pt.size = 0.5, cells.highlight = not_assigned_cells, dims = c(2,1), reduction = "DIM_UMAP") +
  coord_fixed() + 
  scale_color_manual(values=c("#000000", "#f54e1e"))
## create annotation dataframe from these results:
df_monocle_sexes <- rbind(data.frame("cell_name" = colnames(monocle.object_male), "sex" = rep("Male", length(colnames(monocle.object_male)))),
                          data.frame("cell_name" = colnames(monocle.object_female), "sex" = rep("Female", length(colnames(monocle.object_female)))),
                          data.frame("cell_name" = colnames(monocle.object_bipot), "sex" = rep("Bipotential", length(colnames(monocle.object_bipot)))),
                          data.frame("cell_name" = colnames(monocle.object_asex), "sex" = rep("Asexual", length(colnames(monocle.object_asex)))),
                          data.frame("cell_name" = colnames(monocle.object_asex_fate), "sex" = rep("Asexual_Fate", length(colnames(monocle.object_asex_fate)))),
                          data.frame("cell_name" = not_assigned_cells, "sex" = rep("Unassigned", length(not_assigned_cells)))
                          )

dim(df_monocle_sexes)

## order like the metadata
df_monocle_sexes <- df_monocle_sexes[match(rownames(monocle.object@colData), df_monocle_sexes$cell_name), ]

## add this back into the monocle object
monocle.object@colData$Sexes_monocle <- df_monocle_sexes$sex

Pseudotime Calculation

plot <- DimPlot(tenx.mutant.integrated.sex, label = FALSE, label.size = 8, repel = FALSE, pt.size = 0.05, dims = c(2,1), reduction = "DIM_UMAP", group.by = "identity_updated") + 
  coord_fixed() +
  theme(legend.position="bottom", 
        axis.line=element_blank(),
        axis.text.x=element_blank(),
        axis.text.y=element_blank(),
        axis.ticks=element_blank(),
        axis.title.x=element_blank(),
        axis.title.y=element_blank()) + 
  guides(colour=guide_legend(nrow = 3, byrow = TRUE, override.aes = list(size=5)))

HoverLocator(plot = plot, information = FetchData(tenx.mutant.integrated.sex, vars = c("ident", "identity_updated", "nFeature_RNA")))
the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be used`error_y.color` does not currently support multiple values.`error_x.color` does not currently support multiple values.`line.color` does not currently support multiple values.The titlefont attribute is deprecated. Use title = list(font = ...) instead.the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be used`error_y.color` does not currently support multiple values.`error_x.color` does not currently support multiple values.`line.color` does not currently support multiple values.The titlefont attribute is deprecated. Use title = list(font = ...) instead.

save

ggsave("../images_to_export/GCSKO_sexbranch_umap_pt.png", plot = umap_pt, device = "png", path = NULL, scale = 1, width = 10, height = 10, units = "cm", dpi = 300, limitsize = TRUE)

Just check if the ‘hook’ on the males is a lineage or dead/dying/activated gams, or mutants

FeaturePlot(tenx.mutant.integrated.sex, features = "PBANKA-0416100", coord.fixed = TRUE, min.cutoff = "q1", dims = c(2,1), reduction = "DIM_UMAP", pt.size = 1, order = TRUE) + 
            theme_void() + 
            labs(title = paste("MG1 (Male)")) + 
            theme(plot.title = element_text(hjust = 0.5, family="Arial", size = 20, face = "bold")) + 
            scale_colour_gradientn(colours=c("#DCDCDC", plasma(30)))

It appears MG1 marker expression is decreasing/off in these cells - inspect mutant status

```r
## access the closest principal graph node vertex for each cell and assign it as a column in your colData table using
#colData(monocle.object)$closest_vertex <- monocle.object@principal_graph_aux[[\UMAP\]]$pr_graph_cell_proj_closest_vertex[,1]

## plot
#plot_cells(monocle.object, color_cells_by = \closest_vertex\, label_cell_groups = FALSE)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


#### Check how well it correlates with the original pseudotime

when pseudotime was calculated on the whole object


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxubGlicmFyeShnZ3B1YnIpXG4jIyBleHRyYWN0IHBzZXVkb3RpbWUgdmFsdWVzOlxucHRfdmFsdWVzX25ldyA8LSBhcy5kYXRhLmZyYW1lKHBzZXVkb3RpbWUobW9ub2NsZS5vYmplY3QsIHJlZHVjdGlvbl9tZXRob2QgPSBcIlVNQVBcIikpXG5wdF92YWx1ZXNfbmV3JGNlbGxfbmFtZSA8LSByb3duYW1lcyhwdF92YWx1ZXNfbmV3KVxubWV0YV9kYXRhX2RmIDwtIGFzLmRhdGEuZnJhbWUobW9ub2NsZS5vYmplY3RAY29sRGF0YSlcbm1ldGFfZGF0YV9kZiRjZWxsX25hbWUgPC0gcm93bmFtZXMobWV0YV9kYXRhX2RmKVxubWV0YV9kYXRhX2RmIDwtIG1lcmdlKG1ldGFfZGF0YV9kZiwgcHRfdmFsdWVzX25ldywgYnkgPSBcImNlbGxfbmFtZVwiKVxubmFtZXMobWV0YV9kYXRhX2RmKVtuY29sKG1ldGFfZGF0YV9kZildPC0gXCJwdFwiXG5cbmdncGxvdChtZXRhX2RhdGFfZGYsIGFlcyh4ID0gb2xkX3B0X3ZhbHVlcywgeSA9IHB0LCBjb2xvdXIgPSBjbHVzdGVyX2NvbG91cnNfZmlndXJlKSkgKyBcbiAgZ2VvbV9wb2ludCgpICsgIFxuICBnZW9tX3Ntb290aChtZXRob2QgPSBcImxtXCIsIHNlID0gRkFMU0UpICtcbiAgdGhlbWVfY2xhc3NpYygpICsgc3RhdF9jb3IobWV0aG9kID0gXCJwZWFyc29uXCIpXG5gYGAifQ== -->

```r
library(ggpubr)
## extract pseudotime values:
pt_values_new <- as.data.frame(pseudotime(monocle.object, reduction_method = "UMAP"))
pt_values_new$cell_name <- rownames(pt_values_new)
meta_data_df <- as.data.frame(monocle.object@colData)
meta_data_df$cell_name <- rownames(meta_data_df)
meta_data_df <- merge(meta_data_df, pt_values_new, by = "cell_name")
names(meta_data_df)[ncol(meta_data_df)]<- "pt"

ggplot(meta_data_df, aes(x = old_pt_values, y = pt, colour = cluster_colours_figure)) + 
  geom_point() +  
  geom_smooth(method = "lm", se = FALSE) +
  theme_classic() + stat_cor(method = "pearson")

This shows very good correlation.

Isolate Branches

## access the closest principal graph node vertex for each cell and assign it as a column in your colData table using
#colData(monocle.object)$closest_vertex <- monocle.object@principal_graph_aux[["UMAP"]]$pr_graph_cell_proj_closest_vertex[,1]

## plot
#plot_cells(monocle.object, color_cells_by = "closest_vertex", label_cell_groups = FALSE)

Module Construction

## find genes that change as a function of pt:
monocle.object_pr_test_res <- graph_test(monocle.object, neighbor_graph="principal_graph", cores=8)

## find significant genes
## I used 0.05 previously in all cells 
## 2884 w. p = 0.01, 3260 w. p = 0.05
pr_deg_ids <- row.names(subset(monocle.object_pr_test_res, q_value < 0.05))

## collect into modules
gene_module_df_sex <- find_gene_modules(monocle.object[pr_deg_ids,], resolution=c(10^seq(-6,2)), random_seed = 1234)

## how many genes in modules?
dim(gene_module_df_sex)

Plot Modules

General Module Composition

Make a dataframe to plot by aggregating clusters vs. modules

## create a list of our mutant gene IDs
list_of_mutant_genes <- c("PBANKA-0828000", "PBANKA-1302700", "PBANKA-1447900", "PBANKA-0102400", "PBANKA-0716500", "PBANKA-1435200", "PBANKA-1418100", "PBANKA-0902300", "PBANKA-0413400", "PBANKA-1454800")

## make a dataframe to convert the gene IDs into actual IDs
df_mutant_ids <- as.data.frame(unique(cbind(tenx.mutant.integrated@meta.data$identity_gene_updated, tenx.mutant.integrated@meta.data$identity_updated, tenx.mutant.integrated@meta.data$identity_name_updated)))[-c(1, 3),]
# remove the "820" bit on 10
df_mutant_ids$V1 <- gsub("_820", "", df_mutant_ids$V1)
# change the underscore (_) to a dash (-) in gene IDs
df_mutant_ids$V1 <- gsub("_", "-", df_mutant_ids$V1)
names(df_mutant_ids) <- c("gene_ID", "mutant_identity", "mutant_identity_2")

## subset modules df to include only mutant gene IDs
df_mutant_gene_modules <- as.data.frame(gene_module_df_sex[which(gene_module_df_sex$id %in% list_of_mutant_genes),])
names(df_mutant_gene_modules)[1] <- "gene_ID"

## merge dataframes
df_mutant_gene_modules <- merge(df_mutant_gene_modules, df_mutant_ids, by = "gene_ID")

## Inspect
df_mutant_gene_modules

Find out how many genes there are per total so we can add this to the plot

## how many genes per module?
genes_per_module <- as.data.frame(table(gene_module_df_sex$module))
genes_per_module

Find out which modules our mutant genes reside in

## create a list of our mutant gene IDs
list_of_mutant_genes <- c("PBANKA-0828000", "PBANKA-1302700", "PBANKA-1447900", "PBANKA-0102400", "PBANKA-0716500", "PBANKA-1435200", "PBANKA-1418100", "PBANKA-0902300", "PBANKA-0413400", "PBANKA-1454800")

## make a dataframe to convert the gene IDs into actual IDs
df_mutant_ids <- as.data.frame(unique(cbind(tenx.mutant.integrated@meta.data$identity_gene_updated, tenx.mutant.integrated@meta.data$identity_updated, tenx.mutant.integrated@meta.data$identity_name_updated)))[-c(1, 3),]
# remove the "820" bit on 10
df_mutant_ids$V1 <- gsub("_820", "", df_mutant_ids$V1)
# change the underscore (_) to a dash (-) in gene IDs
df_mutant_ids$V1 <- gsub("_", "-", df_mutant_ids$V1)
names(df_mutant_ids) <- c("gene_ID", "mutant_identity", "mutant_identity_2")

## subset modules df to include only mutant gene IDs
df_mutant_gene_modules <- as.data.frame(gene_module_df_sex[which(gene_module_df_sex$id %in% list_of_mutant_genes),])
names(df_mutant_gene_modules)[1] <- "gene_ID"

## merge dataframes
df_mutant_gene_modules <- merge(df_mutant_gene_modules, df_mutant_ids, by = "gene_ID")

## Inspect
df_mutant_gene_modules

so modules of interest are:

table(df_mutant_gene_modules$module)

Which modules do other genes of interest lie in?:

## landmark genes (genes of interest)
# AP2G - PBANKA-1437500
# AP2 - PBANKA-0909600 - from poran paper
# AP2G-2 - PBANKA-1034300 
# ccp2 - "PBANKA-1319500" - female 820
# p25 - "PBANKA-0515000" - female
# p28 - "PBANKA-0514900" - female
# ccp3 - "PBANKA-1035200" - female -  https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5909122/
# nek4 - "PBANKA-0616700" - female
# ap2-fg - "PBANKA-1415700" - female 
# dozi - "PBANKA-1217700" - female
# MG1 - "PBANKA-0416100" - male 820
# hap2 - "PBANKA-1212600" - male
# MAPK2 - "PBANKA-0933700" - male
# nek1 - "PBANKA-1443000" - male
# cdpk4 - "PBANKA-0615200" - male

## create a list of landmark genes
list_of_landmark_genes <- c("PBANKA-1437500",
                            "PBANKA-0909600",
                            "PBANKA-1034300", 
                            "PBANKA-1319500", 
                            "PBANKA-0515000",
                            "PBANKA-0514900",
                            "PBANKA-1035200",
                            "PBANKA-0616700",
                            "PBANKA-1415700",
                            "PBANKA-1217700",
                            "PBANKA-0416100", 
                            "PBANKA-1212600",
                            "PBANKA-0933700",
                            "PBANKA-1443000",
                            "PBANKA-0615200")

name_of_landmark_genes <- c("AP2-G", 
                            "AP2_poran", 
                            "AP2-G2", 
                            "ccp2", 
                            "p25", 
                            "p28",
                            "ccp3",
                            "nek4",
                            "ap2-fg",
                            "DOZI",
                            "mg1", 
                            "hap2", 
                            "mapk2",
                            "nek1",
                            "cdpk4")

## make a df
name_of_landmark_genes <- data.frame("gene_name" = name_of_landmark_genes, "id" = list_of_landmark_genes)

## make dataframe
df_landmark_gene_modules <- gene_module_df_sex[which(gene_module_df_sex$id %in% list_of_landmark_genes),]

## merge dataframes
df_landmark_gene_modules <- merge(df_landmark_gene_modules, name_of_landmark_genes, by = "id")

## inspect
df_landmark_gene_modules

enrichment of screen hits in modules

## read in screen hits
library("readxl")
screen_hits <- read_excel("../data/Screen/Modules_Clusters_Phenotypes.xlsx")

## get only hits
screen_hits_selected <- screen_hits[which(screen_hits$`Gam phenotype screen` == "Both" | screen_hits$`Gam phenotype screen` == "Females" | screen_hits$`Gam phenotype screen` == "Males"), ] 

## extract gene IDs
gene_hits <- screen_hits_selected$`new gene ID`
## change the underscore to a dash
gene_hits <- gsub("_", "-", gene_hits)

## find out which modules they are in
df_hits_gene_modules <- gene_module_df_sex[which(gene_module_df_sex$id %in% gene_hits),]
print("screen hits by module")
table(df_hits_gene_modules$module)

## get the number genes screened in that module
screen_hits_screened <- screen_hits[which(screen_hits$`Gam phenotype screen` == "Both" | screen_hits$`Gam phenotype screen` == "Females" | screen_hits$`Gam phenotype screen` == "Males" | screen_hits$`Gam phenotype screen` == "None" | screen_hits$`Gam phenotype screen` == "male not enough power"), ] 
## extract gene IDs
genes_screened <- screen_hits_screened$`new gene ID`
## change the underscore to a dash
genes_screened <- gsub("_", "-", genes_screened)
## find out which modules they are in
df_screened_gene_modules <- gene_module_df_sex[which(gene_module_df_sex$id %in% genes_screened),]
print("total genes screened in this module")
table(df_screened_gene_modules$module)

## make a table with this info
pc_screened <- data.frame(hits = table(df_hits_gene_modules$module), screened =  table(df_screened_gene_modules$module))[,-3]
names(pc_screened) <- c("module", "hits", "screened")
pc_screened$pc <- (pc_screened$hits /pc_screened$screened)*100

## view
pc_screened

Further investigation of screen hits

## rename df
df_screen_hits_selected <- as.data.frame(screen_hits_selected)
df_screen_hits_selected$'new gene ID' <- gsub("_", "-", df_screen_hits_selected$'new gene ID')
names(df_screen_hits_selected)[2] <- "id"
df_gene_module_df_sex <- as.data.frame(gene_module_df_sex)

## merge dfs together
screen_hits_modules <- merge(df_screen_hits_selected, df_gene_module_df_sex, by = "id")

## view
screen_hits_modules

DOZI-regulated genes

Find out how many of the genes in each module has a DOZI-regulated gene

DOZI_regulated_genes <-
read.csv(file = "../data/Reference/DOZI_regulated_genes.csv", header = TRUE)

## extract gene IDs
dozi_genes <- DOZI_regulated_genes[DOZI_regulated_genes$DOZI_regulated. == "YES", ]$Gene_ID_PB
## change the underscore to a dash
dozi_genes <- gsub("_", "-", dozi_genes)

## find out which modules they are in
df_dozi_gene_modules <- gene_module_df_sex[which(gene_module_df_sex$id %in% dozi_genes),]
print("dozi genes by module")
table(df_dozi_gene_modules$module)

Visualise module expression

plot out modules

## make aggregated df again so you can edit it
agg_mat <- aggregate_gene_expression(monocle.object, gene_module_df_sex, cell_group_df)

## h clust the aggregated matrix
module_dendro <- hclust(dist(agg_mat))

## use these clusters to reorder the modules
gene_module_df_sex$module <- factor(gene_module_df_sex$module, levels = row.names(agg_mat)[module_dendro$order])

## plot
UMAP_modules <- plot_cells(monocle.object, genes=gene_module_df_sex %>% filter(module %in% c(1:20)),
           cell_size = 2, 
           x = 2, y = 1,
           label_cell_groups=FALSE,
           scale_to_range = TRUE,
           show_trajectory_graph=FALSE) +
                          scale_colour_viridis_c(name = "expression", option = "C", alpha = 1) +
                          coord_fixed() +
                          theme_void() +
                          theme(legend.position = "bottom", strip.text.x = element_text(size = 15))

## view
UMAP_modules

save

ggsave("../images_to_export/GCSKO_sexbranch_umap_modules.png", plot = UMAP_modules, device = "png", path = NULL, scale = 1, width = 30, height = 30, units = "cm", dpi = 300, limitsize = TRUE)
## make a dataframe of genes per module
genes_per_module <- as.data.frame(table(gene_module_df_sex$module))

## inspect
genes_per_module
## A. Preparation of dataframe

## prepare custom dataframe for all cells by modules:
agg_mat_no_group <- aggregate_gene_expression(monocle.object, gene_module_df_sex, scale_agg_values = TRUE)

## B. annotations

## make an anotation
## add pt to the monocle object
monocle.object@colData$pt <- as.data.frame(pseudotime(monocle.object, reduction_method = "UMAP"))
## make an annotation dataframe
anno_no_group <- data.frame(monocle.object@colData$cluster_colours_figure, monocle.object@colData$pt, as.factor(monocle.object@colData$Prediction.Spearman._Kasia), row.names = rownames(monocle.object@colData))
names(anno_no_group) <- c("Sex", "Pseudotime", "Real_time_prediction")

## make annotation colours
annotation_colours <- list(Sex = c(Male="#016c00", Female="#a52b1e", Bipotential = "#ffe400", Asexual = "#0052c5"),
                           Pseudotime = plasma(12, direction = 1),
                           Real_time_prediction = c("0" = viridis(8, direction = 1)[1] ,"1" =  viridis(8, direction = 1)[2] ,"4" = viridis(8, direction = 1)[3] ,"6" = viridis(8, direction = 1)[4] ,"8" = viridis(8, direction = 1)[5]  ,"12"  = viridis(8, direction = 1)[6]  ,"18" = viridis(8, direction = 1)[7]  ,"24" = viridis(8, direction = 1)[8]))

## change the order of the cols (cells) in data frame
col.order <- rownames(anno_no_group[with(anno_no_group, order(Sex, Pseudotime)), ])
agg_mat_no_group <- agg_mat_no_group[,col.order]

## reorder the rows (gene modules) in the data frame so they are in pt order
## define the order visually and using the clusters originally produced
row.order <- c("8", "3","4", "15", "2", "18", "11",
               "7", "1", "13",
               "10", "14", "12", "16", "9",
               "5","6", "17",
               "19", "20")
## reorder using new order
agg_mat_no_group <- agg_mat_no_group[row.order, ]

## for cuts in columns - used later to count number of cells in each cat
df_meta <- as.data.frame(monocle.object@colData)
female_cells <- rownames(df_meta[which(df_meta$cluster_colours_figure == "Female"), ])
male_cells <- rownames(df_meta[which(df_meta$cluster_colours_figure == "Male"), ])
bi_cells <- rownames(df_meta[which(df_meta$cluster_colours_figure == "Bipotential"), ])
asex_cells <- rownames(df_meta[which(df_meta$cluster_colours_figure == "Asexual"), ])
rm(df_meta)

## add module and the number of cells to the row
## change names for row names to include "module " at the begining of them
labels.row <- stringr::str_c("Module ", row.names(agg_mat_no_group))
## reorder frequency so that it is matching our matrix
genes_per_module_ordered <- genes_per_module[match(row.names(agg_mat_no_group), genes_per_module$Var1), ]
## add number of cells to the rownames for the module
for(i in seq_along(genes_per_module_ordered$Freq)){
  labels.row[i] <- stringr::str_c(labels.row[i]," (n = " ,genes_per_module_ordered$Freq[i], ")")
}

## C. Plotting

## plot
heatmap_main <- pheatmap::pheatmap(agg_mat_no_group, 
                   #scale="row",
                   cluster_cols = FALSE,
                   cluster_rows = FALSE,
                   ## others: ward.D2,
                   #clustering_method="complete",
                   show_colnames = FALSE,
                   labels_row = labels.row,
                   fontsize_row = 15,
                   fontsize = 15,
                   gaps_col = c(length(asex_cells), length(c(asex_cells,bi_cells)), length(c(asex_cells,bi_cells,female_cells))),
                   annotation_col = anno_no_group, 
                   annotation_colors = annotation_colours, 
                   cutree_rows = 6)

## view
heatmap_main

save

ggsave("../images_to_export/GCSKO_sexbranch_heatmap.png", plot = heatmap_main, device = "png", path = NULL, scale = 1, width = 27, height = 20, units = "cm", dpi = 300, limitsize = TRUE)
## A. Preparation of dataframe

## prepare custom dataframe for all cells by modules:
agg_mat_no_group <- aggregate_gene_expression(monocle.object, gene_module_df_sex, scale_agg_values = TRUE)

## B. annotations

## make an anotation
## add pt to the monocle object
monocle.object@colData$pt <- as.data.frame(pseudotime(monocle.object, reduction_method = "UMAP"))
## make an annotation dataframe
anno_no_group <- data.frame(monocle.object@colData$Sexes_monocle, monocle.object@colData$cluster_colours_figure, monocle.object@colData$pt, as.factor(monocle.object@colData$Prediction.Spearman._Kasia), row.names = rownames(monocle.object@colData))
## add names to this dataframe
names(anno_no_group) <- c("Sexes_monocle", "Sex", "Pseudotime", "Real_time_prediction")
## make the sexes classification a factor so it can be reordered (explaination here: https://rstudio-pubs-static.s3.amazonaws.com/7433_4537ea5073dc4162950abb715f513469.html)
anno_no_group$Sexes_monocle <- factor(anno_no_group$Sexes_monocle, levels = c("Asexual", "Unassigned", "Asexual_Fate", "Bipotential", "Female", "Male"))

## make annotation colours
annotation_colours <- list(Sexes_monocle = c(Male="#016c00", Female="#a52b1e", Bipotential = "#ffe400", Asexual = "#0052c5", Asexual_Fate = "#77A9D8", Unassigned = "#0052c5"),
                           Sex = c(Male="#016c00", Female="#a52b1e", Bipotential = "#ffe400", Asexual = "#0052c5"),
                           Pseudotime = plasma(12, direction = 1),
                           Real_time_prediction = c("0" = viridis(8, direction = 1)[1] ,"1" =  viridis(8, direction = 1)[2] ,"4" = viridis(8, direction = 1)[3] ,"6" = viridis(8, direction = 1)[4] ,"8" = viridis(8, direction = 1)[5]  ,"12"  = viridis(8, direction = 1)[6]  ,"18" = viridis(8, direction = 1)[7]  ,"24" = viridis(8, direction = 1)[8]))

## change the order of the cols (cells) in data frame
col.order <- rownames(anno_no_group[with(anno_no_group, order(Sexes_monocle, Pseudotime)), ])
agg_mat_no_group <- agg_mat_no_group[,col.order]

## reorder the rows (gene modules) in the data frame so they are in pt order
## define the order visually and using the clusters originally produced
row.order <- c("8", "3","4", "15", "2", "18", "11",
               "7", "1", "13",
               "10", "14", "12", "16", "9",
               "5","6", "17",
               "19", "20")
## reorder using new order
agg_mat_no_group <- agg_mat_no_group[row.order, ]

## for cuts in columns - used later to count number of cells in each cat
df_meta <- as.data.frame(monocle.object@colData)
female_cells <- rownames(df_meta[which(df_meta$Sexes_monocle == "Female"), ])
male_cells <- rownames(df_meta[which(df_meta$Sexes_monocle == "Male"), ])
bi_cells <- rownames(df_meta[which(df_meta$Sexes_monocle == "Bipotential"), ])
asex_cells <- rownames(df_meta[which(df_meta$Sexes_monocle == "Asexual"), ])
asex_fate_cells <- rownames(df_meta[which(df_meta$Sexes_monocle == "Asexual_Fate"), ])
unassigned_cells <- rownames(df_meta[which(df_meta$Sexes_monocle == "Unassigned"), ])
rm(df_meta)

## add module and the number of cells to the row
## change names for row names to include "module " at the begining of them
labels.row <- stringr::str_c("Module ", row.names(agg_mat_no_group))
## reorder frequency so that it is matching our matrix
genes_per_module_ordered <- genes_per_module[match(row.names(agg_mat_no_group), genes_per_module$Var1), ]
## add number of cells to the rownames for the module
for(i in seq_along(genes_per_module_ordered$Freq)){
  labels.row[i] <- stringr::str_c(labels.row[i]," (n = " ,genes_per_module_ordered$Freq[i], ")")
}

## C. Plotting

## plot
heatmap_main <- pheatmap::pheatmap(agg_mat_no_group, 
                   #scale="row",
                   cluster_cols = FALSE,
                   cluster_rows = TRUE,
                   ## others: ward.D2,
                   #clustering_method="complete",
                   show_colnames = FALSE,
                   labels_row = labels.row,
                   fontsize_row = 15,
                   fontsize = 15,
                   gaps_col = c(length(asex_cells), length(c(asex_cells,unassigned_cells)), length(c(asex_cells,unassigned_cells, asex_fate_cells)), length(c(asex_cells,unassigned_cells, asex_fate_cells,bi_cells)), length(c(asex_cells,unassigned_cells, asex_fate_cells,bi_cells, female_cells)), length(c(asex_cells,unassigned_cells, asex_fate_cells,bi_cells, female_cells, male_cells))),
                   annotation_col = anno_no_group, 
                   annotation_colors = annotation_colours, 
                   cutree_rows = 6)

## view
heatmap_main

This is for:

## repeat of plot above:
## Plot
umap_pt <- plot_cells(monocle.object, color_cells_by = "pseudotime", label_cell_groups=FALSE, cell_size = 1, x = 2, y = 1, label_branch_points=FALSE, label_leaves=FALSE, label_groups_by_cluster=FALSE, label_roots = FALSE) +
  coord_fixed() +
  theme_void() +
  labs(title = "Pseudotime") +
  theme(plot.title = element_text(hjust = 0.5))

## view
umap_pt

Visualise the expression of select genes over pseudotime

## landmark genes (genes of interest)
# AP2G - PBANKA-1437500
# AP2 - PBANKA-0909600 - from poran paper
# AP2G-2 - PBANKA-1034300 
#list_of_mutant_genes <- c("PBANKA-0828000", "PBANKA-1302700", "PBANKA-1447900", "PBANKA-0102400", "PBANKA-0716500", "PBANKA-1435200", "PBANKA-1418100", "PBANKA-1144800", "PBANKA-0902300", "PBANKA-0413400", "PBANKA-1454800")

## define genes to plot
list_of_genes_of_interest <- c("PBANKA-0102400", "PBANKA-0413400", "PBANKA-0716500", "PBANKA-0828000", "PBANKA-0902300", "PBANKA-1144800", "PBANKA-1302700", "PBANKA-1418100", "PBANKA-1435200", "PBANKA-1447900", "PBANKA-1454800", "PBANKA-1437500", "PBANKA-1319500", "PBANKA-0416100", "PBANKA-1034300")
## add names
names_of_genes_of_interest <- c("GCSKO-2", "GCSKO-10", "GCSKO-19", "GCSKO-3", "GCSKO-13", "GCSKO-28", "GCSKO-oom", "GCSKO-17", "GCSKO-20", "GCSKO-29", "GCSKO-21", "AP2-G", "CCP2", "MG1", "AP2-G2")

##make df for genes of interest
genes_of_interest <- data.frame(gene = list_of_genes_of_interest, group = c(1:length(list_of_genes_of_interest)), name = names_of_genes_of_interest)
## reorder
#genes_of_interest <- genes_of_interest[match(c("AP2-G", "CCP2", "GCSKO-21", "GCSKO-17", "GCSKO-2", "MG1", "GCSKO-20", "GCSKO-3", "GCSKO-oom", "GCSKO-29", "GCSKO-10", "GCSKO-28", "GCSKO-19", "GCSKO-13"), genes_of_interest$name), ]

## prepare custom dataframe for all cells by modules:
agg_mat_genes_of_interest <- aggregate_gene_expression(monocle.object, genes_of_interest[,1:2])

## reorder using new order
agg_mat_genes_of_interest <- agg_mat_genes_of_interest[,col.order]

## plot
heatmap_plot <- pheatmap::pheatmap(agg_mat_genes_of_interest, 
                   #scale="row",
                   cluster_cols = FALSE,
                   cluster_rows = TRUE,
                   clustering_method="ward.D2",
                   show_colnames = FALSE,
                   labels_row = as.character(genes_of_interest[,3]),
                   gaps_col = c(length(asex_cells), length(c(asex_cells,bi_cells)), length(c(asex_cells,bi_cells,female_cells))),
                   #gaps_row = c(1, 6),
                   cutree_rows = 2,
                   ## trying to fix legend issue here
                   #fontsize_row = 10,
                   #fontsize_col = 3,
                   #cellheight=3, 
                   #cellwidth = 3,
                   legend = TRUE,
                   annotation_legend = FALSE,
                   annotation_col = anno_no_group, 
                   annotation_colors = annotation_colours
                   )

heatmap_plot

look at some of the “module” genes now too

## landmark genes (genes of interest)
# AP2G - PBANKA-1437500
# AP2 - PBANKA-0909600 - from poran paper
# AP2G-2 - PBANKA-1034300 
#list_of_mutant_genes <- c("PBANKA-0828000", "PBANKA-1302700", "PBANKA-1447900", "PBANKA-0102400", "PBANKA-0716500", "PBANKA-1435200", "PBANKA-1418100", "PBANKA-1144800", "PBANKA-0902300", "PBANKA-0413400", "PBANKA-1454800")

## define genes to plot
list_of_genes_of_interest <- c("PBANKA-1454000", "PBANKA-1354000")
## add names
names_of_genes_of_interest <- c("GyrB", "DBR1")

##make df for genes of interest
genes_of_interest <- data.frame(gene = list_of_genes_of_interest, group = c(1:length(list_of_genes_of_interest)), name = names_of_genes_of_interest)
## reorder
#genes_of_interest <- genes_of_interest[match(c("AP2-G", "CCP2", "GCSKO-21", "GCSKO-17", "GCSKO-2", "MG1", "GCSKO-20", "GCSKO-3", "GCSKO-oom", "GCSKO-29", "GCSKO-10", "GCSKO-28", "GCSKO-19", "GCSKO-13"), genes_of_interest$name), ]

## prepare custom dataframe for all cells by modules:
agg_mat_genes_of_interest <- aggregate_gene_expression(monocle.object, genes_of_interest[,1:2])

## reorder using new order
agg_mat_genes_of_interest <- agg_mat_genes_of_interest[,col.order]

## plot
heatmap_plot <- pheatmap::pheatmap(agg_mat_genes_of_interest, 
                   #scale="row",
                   cluster_cols = FALSE,
                   cluster_rows = TRUE,
                   clustering_method="ward.D2",
                   show_colnames = FALSE,
                   labels_row = as.character(genes_of_interest[,3]),
                   gaps_col = c(length(asex_cells), length(c(asex_cells,bi_cells)), length(c(asex_cells,bi_cells,female_cells))),
                   #gaps_row = c(1, 6),
                   cutree_rows = 2,
                   ## trying to fix legend issue here
                   #fontsize_row = 10,
                   #fontsize_col = 3,
                   #cellheight=3, 
                   #cellwidth = 3,
                   legend = TRUE,
                   annotation_legend = FALSE,
                   annotation_col = anno_no_group, 
                   annotation_colors = annotation_colours
                   )

heatmap_plot

Plot specific genes of interest

Side plots

construct new dataframes for the cells from mutants for each sex

## The original object contains all cells, we just want wild-type so let's subset out gene_module_df and cell_group_df accordingly

## male
## subset out only male and pre determination cells
male_cells <- tenx.mutant.integrated.sex@meta.data[which(tenx.mutant.integrated.sex@meta.data$at_sex == "male"), ]
## take forward only smart-seq2
male_cells <- male_cells[which(male_cells$experiment == "mutants"), ]
## get cell names
male_cells <- rownames(male_cells)
## subset Seurat object to contain cells of interest  
male.seurat.object <- SubsetData(tenx.mutant.integrated.sex, cells = male_cells)
## make new counts and pheno:
data <- as(as.matrix(GetAssayData(male.seurat.object, assay = "RNA", slot = "data")), 'sparseMatrix')
pd <- data.frame(male.seurat.object@meta.data)
## keep only the columns that are relevant
#pData <- pd %>% select(orig.ident, nCount_RNA, nFeature_RNA)
fData <- data.frame(gene_short_name = row.names(data), row.names = row.names(data))
## Construct monocle cds
male.monocle.object <- new_cell_data_set(expression_data = data, cell_metadata = pd, gene_metadata = fData)
## preprocess
male.monocle.object = preprocess_cds(male.monocle.object, num_dim = 50, norm_method = "none")  
## make a new dataframe for cell groups - it is crucial to refactor otherwise aggregate_gene_expression thinks it's out of bounds  
#male_cell_group_df <- data.frame(cell=as.character(factor(male_cell_group_df$cell_id)), cell_group=factor(male_cell_group_df$pt_bin))  
## aggregate expression
male_agg_mat <- aggregate_gene_expression(male.monocle.object, gene_module_df_sex, exclude.na = FALSE)

## female
## subset out only male and pre determination cells
female_cells <- tenx.mutant.integrated.sex@meta.data[which(tenx.mutant.integrated.sex@meta.data$at_sex == "female"), ]
## take forward only wild-type
female_cells <- female_cells[which(female_cells$experiment == "mutants"), ]
## get cell names
female_cells <- rownames(female_cells)
## subset our cell group df to keep only these cells
#female_cell_group_df <- female_cell_group_df[which(female_cell_group_df$cell_id %in% female_cells),]
## subset Seurat object to contain cells of interest  
female.seurat.object <- SubsetData(tenx.mutant.integrated.sex, cells = female_cells)
## make new counts and pheno:
data <- as(as.matrix(GetAssayData(female.seurat.object, assay = "RNA", slot = "data")), 'sparseMatrix')
pd <- data.frame(female.seurat.object@meta.data)
## keep only the columns that are relevant
#pData <- pd %>% select(orig.ident, nCount_RNA, nFeature_RNA)
fData <- data.frame(gene_short_name = row.names(data), row.names = row.names(data))
## Construct monocle cds
female.monocle.object <- new_cell_data_set(expression_data = data, cell_metadata = pd, gene_metadata = fData)
## preprocess
female.monocle.object = preprocess_cds(female.monocle.object, num_dim = 50, norm_method = "none")  
## make a new dataframe for cell groups - it is crucial to refactor otherwise aggregate_gene_expression thinks it's out of bounds  
#female_cell_group_df <- data.frame(cell=as.character(factor(female_cell_group_df$cell_id)), cell_group=factor(female_cell_group_df$pt_bin))  
## aggregate expression
female_agg_mat <- aggregate_gene_expression(female.monocle.object, gene_module_df_sex, exclude.na = FALSE)

male

# male_agg_mat
## reorder using new order
male_agg_mat <- male_agg_mat[row.order, ]

## make an anotation
anno_male <- data.frame(male.monocle.object@colData$at_sex, male.monocle.object@colData$old_pt_values, genotype = male.monocle.object@colData$identity_updated, row.names = rownames(male.monocle.object@colData))
names(anno_male) <- c("sex", "Pseudotime", "genotype")

## make annotation colours
annotation_colours <- list(sex = c(male="#016c00", female="#a52b1e", 'pre-det' = "#0052c5"),
                           Pseudotime = magma(12, direction = 1))

## change the order of the data frame
col.order.male <- rownames(anno_male[with(anno_male, order(genotype, Pseudotime)), ])
male_agg_mat <- male_agg_mat[,col.order.male]

## plot
heatmap_male <- pheatmap::pheatmap(male_agg_mat, 
                   #scale="row",
                   cluster_cols = FALSE,
                   cluster_rows = FALSE,
                   clustering_method="ward.D2",
                   show_colnames = FALSE,
                   legend = FALSE,
                   annotation_legend = TRUE,
                   annotation_col = anno_male, 
                   annotation_colors = annotation_colours, 
                   cutree_rows = 12)

heatmap_male
# female_agg_mat
## reorder using new order
female_agg_mat <- female_agg_mat[row.order, ]

## make an anotation
anno_female <- data.frame(female.monocle.object@colData$at_sex, female.monocle.object@colData$old_pt_values, genotype = female.monocle.object@colData$identity_updated, row.names = rownames(female.monocle.object@colData))
names(anno_female) <- c("sex", "Pseudotime", "genotype")

## make annotation colours
annotation_colours <- list(sex = c(male="#016c00", female="#a52b1e", 'pre-det' = "#0052c5"),
                           Pseudotime = magma(12, direction = 1))

## change the order of the data frame
col.order.female <- rownames(anno_female[with(anno_female, order(genotype, Pseudotime)), ])
female_agg_mat <- female_agg_mat[,col.order.female]

## plot
heatmap_female <- pheatmap::pheatmap(female_agg_mat, 
                   #scale="row",
                   cluster_cols = FALSE,
                   cluster_rows = FALSE,
                   clustering_method="ward.D2",
                   show_colnames = FALSE,
                   legend = FALSE,
                   annotation_legend = FALSE,
                   annotation_col = anno_female, 
                   annotation_colors = annotation_colours, 
                   cutree_rows = 12)

heatmap_female

## save a pheatmap: https://stackoverflow.com/questions/43051525/how-to-draw-pheatmap-plot-to-screen-and-also-save-to-file

side plots with groups of mutant cells

female

## make a new grouping for cells based on their identity
mutant_group_female <- data.frame(cell = rownames(female.monocle.object@colData), cell_group = female.monocle.object@colData$identity_updated)

## aggregate expression
female_agg_mat_grouped <- aggregate_gene_expression(female.monocle.object, gene_module_df_sex, mutant_group_female, exclude.na = FALSE)

## reorder using new order
female_agg_mat_grouped <- female_agg_mat_grouped[row.order, ]

## plot
pheatmap::pheatmap(female_agg_mat_grouped, 
                   #scale="row",
                   cluster_cols = TRUE,
                   cluster_rows = FALSE,
                   clustering_method="ward.D2",
                   show_colnames = TRUE,
                   legend = FALSE,
                   annotation_legend = FALSE,
                   #annotation_col = anno_female, 
                   #annotation_colors = annotation_colours, 
                   cutree_rows = 12)

male

module 12 inspection

## make a df for module 12 genes
module.12.genes <- gene_module_df_sex[gene_module_df_sex$module == 12, ]$id
module.12.genes <- data.frame(id = module.12.genes, group = module.12.genes)

## prepare custom dataframe for all cells by modules:
agg_mat_module_12 <- aggregate_gene_expression(monocle.object, module.12.genes)

## make an anotation
anno_no_group <- data.frame(monocle.object@colData$sex_UMAP, monocle.object@colData$old_pt_values, row.names = rownames(monocle.object@colData))
names(anno_no_group) <- c("sex", "Pseudotime")

## make annotation colours
annotation_colours <- list(sex = c(male="#016c00", female="#a52b1e", 'pre-det' = "#0052c5"),
                           Pseudotime = magma(12, direction = 1))

## change the order of the data frame
col.order <- c(pre_det_ordered_cells, female_ordered_cells, male_ordered_cells)
agg_mat_module_12 <- agg_mat_module_12[,col.order]

## plot
pheatmap::pheatmap(agg_mat_module_12, 
                   #scale="row",
                   cluster_cols = FALSE,
                   clustering_method="ward.D2",
                   show_colnames = FALSE,
                   annotation_col = anno_no_group, 
                   annotation_colors = annotation_colours,
                   fontsize_row = 7,
                   cutree_rows = 12)

save plot

```r
## reading table of AP2 genes
ap2_genes_table <- read.delim(file = \~/data/AP2_genes_table.txt\, header = TRUE, sep =\\t\)

## extract list of genes
ap2_genes_list <- dplyr::pull(ap2_genes_table, Gene.ID)
ap2_genes_list <- gsub(\_\, \-\, ap2_genes_list)

## make a df for genes
ap2_genes_list <- data.frame(id = ap2_genes_list, group = ap2_genes_list)

## prepare custom dataframe for all cells by modules:
agg_mat_ap2s <- aggregate_gene_expression(monocle.object, ap2_genes_list)

## change the order of the data frame
col.order <- c(pre_det_ordered_cells, female_ordered_cells, male_ordered_cells)
agg_mat_ap2s <- agg_mat_ap2s[,col.order]

## plot
pheatmap::pheatmap(agg_mat_ap2s, 
                   #scale=\row\,
                   cluster_cols = FALSE,
                   clustering_method=\complete\,
                   show_colnames = FALSE,
                   annotation_col = anno_no_group, 
                   annotation_colors = annotation_colours,
                   fontsize_row = 7,
                   cutree_rows = 3)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


AP2 Expression


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuIyMgcmVhZGluZyB0YWJsZSBvZiBBUDIgZ2VuZXNcbmFwMl9nZW5lc190YWJsZSA8LSByZWFkLmRlbGltKGZpbGUgPSBcIn4vZGF0YS9BUDJfZ2VuZXNfdGFibGUudHh0XCIsIGhlYWRlciA9IFRSVUUsIHNlcCA9XCJcXHRcIilcblxuIyMgZXh0cmFjdCBsaXN0IG9mIGdlbmVzXG5hcDJfZ2VuZXNfbGlzdCA8LSBkcGx5cjo6cHVsbChhcDJfZ2VuZXNfdGFibGUsIEdlbmUuSUQpXG5hcDJfZ2VuZXNfbGlzdCA8LSBnc3ViKFwiX1wiLCBcIi1cIiwgYXAyX2dlbmVzX2xpc3QpXG5cbiMjIG1ha2UgYSBkZiBmb3IgZ2VuZXNcbmFwMl9nZW5lc19saXN0IDwtIGRhdGEuZnJhbWUoaWQgPSBhcDJfZ2VuZXNfbGlzdCwgZ3JvdXAgPSBhcDJfZ2VuZXNfbGlzdClcblxuIyMgcHJlcGFyZSBjdXN0b20gZGF0YWZyYW1lIGZvciBhbGwgY2VsbHMgYnkgbW9kdWxlczpcbmFnZ19tYXRfYXAycyA8LSBhZ2dyZWdhdGVfZ2VuZV9leHByZXNzaW9uKG1vbm9jbGUub2JqZWN0LCBhcDJfZ2VuZXNfbGlzdClcblxuIyMgY2hhbmdlIHRoZSBvcmRlciBvZiB0aGUgZGF0YSBmcmFtZVxuY29sLm9yZGVyIDwtIGMocHJlX2RldF9vcmRlcmVkX2NlbGxzLCBmZW1hbGVfb3JkZXJlZF9jZWxscywgbWFsZV9vcmRlcmVkX2NlbGxzKVxuYWdnX21hdF9hcDJzIDwtIGFnZ19tYXRfYXAyc1ssY29sLm9yZGVyXVxuXG4jIyBwbG90XG5waGVhdG1hcDo6cGhlYXRtYXAoYWdnX21hdF9hcDJzLCBcbiAgICAgICAgICAgICAgICAgICAjc2NhbGU9XCJyb3dcIixcbiAgICAgICAgICAgICAgICAgICBjbHVzdGVyX2NvbHMgPSBGQUxTRSxcbiAgICAgICAgICAgICAgICAgICBjbHVzdGVyaW5nX21ldGhvZD1cImNvbXBsZXRlXCIsXG4gICAgICAgICAgICAgICAgICAgc2hvd19jb2xuYW1lcyA9IEZBTFNFLFxuICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25fY29sID0gYW5ub19ub19ncm91cCwgXG4gICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbl9jb2xvcnMgPSBhbm5vdGF0aW9uX2NvbG91cnMsXG4gICAgICAgICAgICAgICAgICAgZm9udHNpemVfcm93ID0gNyxcbiAgICAgICAgICAgICAgICAgICBjdXRyZWVfcm93cyA9IDMpXG5gYGAifQ== -->

```r
## reading table of AP2 genes
ap2_genes_table <- read.delim(file = "~/data/AP2_genes_table.txt", header = TRUE, sep ="\t")

## extract list of genes
ap2_genes_list <- dplyr::pull(ap2_genes_table, Gene.ID)
ap2_genes_list <- gsub("_", "-", ap2_genes_list)

## make a df for genes
ap2_genes_list <- data.frame(id = ap2_genes_list, group = ap2_genes_list)

## prepare custom dataframe for all cells by modules:
agg_mat_ap2s <- aggregate_gene_expression(monocle.object, ap2_genes_list)

## change the order of the data frame
col.order <- c(pre_det_ordered_cells, female_ordered_cells, male_ordered_cells)
agg_mat_ap2s <- agg_mat_ap2s[,col.order]

## plot
pheatmap::pheatmap(agg_mat_ap2s, 
                   #scale="row",
                   cluster_cols = FALSE,
                   clustering_method="complete",
                   show_colnames = FALSE,
                   annotation_col = anno_no_group, 
                   annotation_colors = annotation_colours,
                   fontsize_row = 7,
                   cutree_rows = 3)

Module Analysis

Read in Kasia’s modules:

## read in kasia modules:
kasia_clusters <- read.csv(file = "~/data/Modules_Clusters_Phenotypes.csv", header = TRUE)

## change _ to -:
kasia_clusters$new.gene.ID <- gsub("_", "-", kasia_clusters$new.gene.ID)

## filter out genes not in modules gene_module_df_sex:
kasia_clusters_filtered <- kasia_clusters[which(kasia_clusters$new.gene.ID %in% gene_module_df_sex$id), ]

## rename new gene id
names(kasia_clusters_filtered)[2] <- "id"

## merge together
modules_merged_df <- merge(kasia_clusters_filtered, gene_module_df_sex, by = "id")

## look at the enrichment with a dotplot:
dot_plot_df_pc <- (as.data.frame.matrix(prop.table(table(modules_merged_df$Kasia.Cluster, df_meta_data$identity_combined), margin = 2)) * 100)

NOT USED complex heatmap version

## make into matrix to plot
col.order <- agg_mat_all_cells_matrix <- as.matrix(agg_mat_all_cells)

make annotation

## extract pseudotime values:
pt_values <- as.data.frame(pseudotime(monocle.object, reduction_method = "UMAP"))
names(pt_values) <- "monocle_pt_sex_wt"
tenx.mutant.integrated.sex <- AddMetaData(tenx.mutant.integrated.sex, pt_values)

## save pt values
write.csv(pt_values, file = "~/data_to_export/pt_values_sex_only.csv")
```r
## extract counts from 10x object
matrix_tenx_counts <- as.matrix(GetAssayData(pb_sex_filtered, assay = \RNA\))
#nk.raw.data <- as.matrix(GetAssayData(pb_sex_filtered, slot = \counts\)[, WhichCells(pbmc, ident = \NK\)])

## check it is the same as the merged object RNA slot

## check it is the same as the monocle object
matrix_tenx_counts_monocle <- as.matrix(as.data.frame((monocle.object@assays)))

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


plot

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMgbWFrZSBoZWF0bWFwXG5tb2R1bGVzX2hlYXRtYXAgPC0gSGVhdG1hcChtYXRyaXhfdGVueF9jb3VudHMsXG4gICAgICAgIGNvbHVtbl9vcmRlciA9IE5VTEwsXG4gICAgICAgIGNsdXN0ZXJfY29sdW1ucyA9IFRSVUUsXG4gICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLFxuICAgICAgICBzaG93X2NvbHVtbl9kZW5kID0gRkFMU0UsXG4gICAgICAgIGNvbHVtbl9sYWJlbHMgPSByZXAoXFxcXCwgbmNvbChtYXRyaXhfdGVueF9jb3VudHMpKSxcbiAgICAgICAgI3Jvd19vcmRlciA9IG1vZHVsZV9kZW5kcm8kb3JkZXIsXG4gICAgICAgIGNsdXN0ZXJpbmdfbWV0aG9kX2NvbHVtbnMgPSBcXHdhcmQuRDJcXCxcbiAgICAgICAgI2JvdHRvbV9hbm5vdGF0aW9uID0gaGVhdG1hcF9hbm5vdGF0aW9uLFxuICAgICAgICBjb2wgPSBjb2xvclJhbXBQYWxldHRlKHJldihicmV3ZXIucGFsKG4gPSA3LCBuYW1lID1cbiAgXFxSZFlsQnVcXCkpKSgxMDApLCBcbiAgICAgICAgaGVhdG1hcF9sZWdlbmRfcGFyYW0gPSBsaXN0KGRpcmVjdGlvbiA9IFxcaG9yaXpvbnRhbFxcKSlcblxuIyMgcHJpbnRcbmRyYXcobW9kdWxlc19oZWF0bWFwLCBtZXJnZV9sZWdlbmQgPSBUUlVFLCBoZWF0bWFwX2xlZ2VuZF9zaWRlID0gXFxib3R0b21cXCwgXG4gICAgYW5ub3RhdGlvbl9sZWdlbmRfc2lkZSA9IFxcYm90dG9tXFwpXG5gYGBcbmBgYCJ9 -->

```r
```r
## make heatmap
modules_heatmap <- Heatmap(matrix_tenx_counts,
        column_order = NULL,
        cluster_columns = TRUE,
        cluster_rows = FALSE,
        show_column_dend = FALSE,
        column_labels = rep(\\, ncol(matrix_tenx_counts)),
        #row_order = module_dendro$order,
        clustering_method_columns = \ward.D2\,
        #bottom_annotation = heatmap_annotation,
        col = colorRampPalette(rev(brewer.pal(n = 7, name =
  \RdYlBu\)))(100), 
        heatmap_legend_param = list(direction = \horizontal\))

## print
draw(modules_heatmap, merge_legend = TRUE, heatmap_legend_side = \bottom\, 
    annotation_legend_side = \bottom\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuIyMgZXh0cmFjdCBjb3VudHMgZnJvbSAxMHggb2JqZWN0XG5tYXRyaXhfdGVueF9jb3VudHMgPC0gYXMubWF0cml4KEdldEFzc2F5RGF0YShwYl9zZXhfZmlsdGVyZWQsIGFzc2F5ID0gXCJSTkFcIikpXG4jbmsucmF3LmRhdGEgPC0gYXMubWF0cml4KEdldEFzc2F5RGF0YShwYl9zZXhfZmlsdGVyZWQsIHNsb3QgPSBcImNvdW50c1wiKVssIFdoaWNoQ2VsbHMocGJtYywgaWRlbnQgPSBcIk5LXCIpXSlcblxuIyMgY2hlY2sgaXQgaXMgdGhlIHNhbWUgYXMgdGhlIG1lcmdlZCBvYmplY3QgUk5BIHNsb3RcblxuIyMgY2hlY2sgaXQgaXMgdGhlIHNhbWUgYXMgdGhlIG1vbm9jbGUgb2JqZWN0XG5tYXRyaXhfdGVueF9jb3VudHNfbW9ub2NsZSA8LSBhcy5tYXRyaXgoYXMuZGF0YS5mcmFtZSgobW9ub2NsZS5vYmplY3RAYXNzYXlzKSkpXG5gYGAifQ== -->

```r
## extract counts from 10x object
matrix_tenx_counts <- as.matrix(GetAssayData(pb_sex_filtered, assay = "RNA"))
#nk.raw.data <- as.matrix(GetAssayData(pb_sex_filtered, slot = "counts")[, WhichCells(pbmc, ident = "NK")])

## check it is the same as the merged object RNA slot

## check it is the same as the monocle object
matrix_tenx_counts_monocle <- as.matrix(as.data.frame((monocle.object@assays)))
## make heatmap
modules_heatmap <- Heatmap(matrix_tenx_counts,
        column_order = NULL,
        cluster_columns = TRUE,
        cluster_rows = FALSE,
        show_column_dend = FALSE,
        column_labels = rep("", ncol(matrix_tenx_counts)),
        #row_order = module_dendro$order,
        clustering_method_columns = "ward.D2",
        #bottom_annotation = heatmap_annotation,
        col = colorRampPalette(rev(brewer.pal(n = 7, name =
  "RdYlBu")))(100), 
        heatmap_legend_param = list(direction = "horizontal"))

## print
draw(modules_heatmap, merge_legend = TRUE, heatmap_legend_side = "bottom", 
    annotation_legend_side = "bottom")

plot as a function of pseudotime

Now, we will integrate the branch data we produced using slingshot and the pseudotime values to plot this heatmap.

Monocle3 has a handy function that allows us to aggregate expression of groups of cells called aggregate_gene_expression.

The code for this is located here: https://github.com/cole-trapnell-lab/monocle3/blob/1a02274209c765fe7a60f533a31b1da3dacf6785/R/cluster_genes.R

Define the groups of cells

## Split cells into groups of sexes
female_cells <- tenx.mutant.integrated.sex@meta.data[which(tenx.mutant.integrated.sex@meta.data$sex == "female"), ]
male_cells <- tenx.mutant.integrated.sex@meta.data[which(tenx.mutant.integrated.sex@meta.data$sex == "male"), ]
pre_det_cells <- tenx.mutant.integrated.sex@meta.data[which(tenx.mutant.integrated.sex@meta.data$sex == "pre-det"), ]

## inspect range of pt values to determine bin width
hist(female_cells$PT_LineageFemale)
hist(male_cells$PT_LineageMale)
hist(pre_det_cells$PT_LineageFemale)
hist(pre_det_cells$PT_LineageMale)

Use a bin width of 2

there will be two objects for the cell_group_df: male branch and female branch. Both will include the pre-det branch

## Define male and female branch cells
# male
male_branch_meta_data <- tenx.mutant.integrated.sex@meta.data[which(tenx.mutant.integrated.sex@meta.data$sex == "pre-det" | tenx.mutant.integrated.sex@meta.data$sex == "male"), ]

male_branch_meta_data <- data.frame(cell_id = rownames(male_branch_meta_data), pt = male_branch_meta_data$PT_LineageMale)

male_cell_group_df <- male_branch_meta_data

#female
female_branch_meta_data <- tenx.mutant.integrated.sex@meta.data[which(tenx.mutant.integrated.sex@meta.data$sex == "pre-det" | tenx.mutant.integrated.sex@meta.data$sex == "female"), ]

female_branch_meta_data <- data.frame(cell_id = rownames(female_branch_meta_data), pt = female_branch_meta_data$PT_LineageFemale)

female_cell_group_df <- female_branch_meta_data

## what's the range of values for each pt?

range(female_cell_group_df$pt)
range(male_cell_group_df$pt)
## make bin widths
# make a new col for annotation
female_cell_group_df$pt_bin <- NA
for(i in seq(2,68,2)){
  female_cell_group_df$pt_bin[which(female_cell_group_df$pt < i & female_cell_group_df$pt >= (i-2))] <- i
}

male_cell_group_df$pt_bin <- NA
for(i in seq(2,68,2)){
  male_cell_group_df$pt_bin[which(male_cell_group_df$pt < i & male_cell_group_df$pt >= (i-2))] <- i
}
# then remove old pt values
male_cell_group_df <- male_cell_group_df[ ,-2]
female_cell_group_df <- female_cell_group_df[ ,-2]
## The original object contains all cells, we just want wild-type so let's subset out gene_module_df and cell_group_df accordingly

## male
## subset out only male and pre determination cells
male_cells <- tenx.mutant.integrated.sex@meta.data[which(tenx.mutant.integrated.sex@meta.data$sex == "male" | tenx.mutant.integrated.sex@meta.data$sex == "pre-det"), ]
## take forward only wild-type
male_cells <- male_cells[which(male_cells$identity_combined == "WT" | male_cells$identity_combined == "WT_10X"), ]
#male_cells <- male_cells[which(male_cells$identity_combined == "WT_10X"), ]
## get cell names
male_cells <- rownames(male_cells)
## subset our cell group df to keep only these cells
male_cell_group_df <- male_cell_group_df[which(male_cell_group_df$cell_id %in% male_cells),]
## subset Seurat object to contain cells of interest  
male.seurat.object <- SubsetData(tenx.mutant.integrated.sex, cells = male_cells)
## make new counts and pheno:
data <- as(as.matrix(GetAssayData(male.seurat.object, assay = "RNA", slot = "data")), 'sparseMatrix')
pd <- data.frame(male.seurat.object@meta.data)
## keep only the columns that are relevant
#pData <- pd %>% select(orig.ident, nCount_RNA, nFeature_RNA)
fData <- data.frame(gene_short_name = row.names(data), row.names = row.names(data))
## Construct monocle cds
male.monocle.object <- new_cell_data_set(expression_data = data, cell_metadata = pd, gene_metadata = fData)
## preprocess
male.monocle.object = preprocess_cds(male.monocle.object, num_dim = 50, norm_method = "none")  
## make a new dataframe for cell groups - it is crucial to refactor otherwise aggregate_gene_expression thinks it's out of bounds  
male_cell_group_df <- data.frame(cell=as.character(factor(male_cell_group_df$cell_id)), cell_group=factor(male_cell_group_df$pt_bin))  
## aggregate expression
male_agg_mat <- aggregate_gene_expression(male.monocle.object, gene_module_df_sex, male_cell_group_df, exclude.na = FALSE)

## female
## subset out only male and pre determination cells
female_cells <- tenx.mutant.integrated.sex@meta.data[which(tenx.mutant.integrated.sex@meta.data$sex == "female" | tenx.mutant.integrated.sex@meta.data$sex == "pre-det"), ]
## take forward only wild-type
female_cells <- female_cells[which(female_cells$identity_combined == "WT" | female_cells$identity_combined == "WT_10X"), ]
#female_cells <- female_cells[which(female_cells$identity_combined == "WT_10X"), ]
## get cell names
female_cells <- rownames(female_cells)
## subset our cell group df to keep only these cells
female_cell_group_df <- female_cell_group_df[which(female_cell_group_df$cell_id %in% female_cells),]
## subset Seurat object to contain cells of interest  
female.seurat.object <- SubsetData(tenx.mutant.integrated.sex, cells = female_cells)
## make new counts and pheno:
data <- as(as.matrix(GetAssayData(female.seurat.object, assay = "RNA", slot = "data")), 'sparseMatrix')
pd <- data.frame(female.seurat.object@meta.data)
## keep only the columns that are relevant
#pData <- pd %>% select(orig.ident, nCount_RNA, nFeature_RNA)
fData <- data.frame(gene_short_name = row.names(data), row.names = row.names(data))
## Construct monocle cds
female.monocle.object <- new_cell_data_set(expression_data = data, cell_metadata = pd, gene_metadata = fData)
## preprocess
female.monocle.object = preprocess_cds(female.monocle.object, num_dim = 50, norm_method = "none")  
## make a new dataframe for cell groups - it is crucial to refactor otherwise aggregate_gene_expression thinks it's out of bounds  
female_cell_group_df <- data.frame(cell=as.character(factor(female_cell_group_df$cell_id)), cell_group=factor(female_cell_group_df$pt_bin))  
## aggregate expression
female_agg_mat <- aggregate_gene_expression(female.monocle.object, gene_module_df_sex, female_cell_group_df, exclude.na = FALSE)
## use these clusters to reorder the modules
male_agg_mat <- male_agg_mat[match(levels(gene_module_df_sex$module), row.names(male_agg_mat)), ]
female_agg_mat <- female_agg_mat[match(levels(gene_module_df_sex$module), row.names(female_agg_mat)), ]

pheatmap::pheatmap(male_agg_mat, 
                   scale="row",
                   #clustering_method="ward.D2",
                   cluster_rows = FALSE,
                   cluster_cols = FALSE)

pheatmap::pheatmap(male_agg_mat, 
                   scale="column",
                   #clustering_method="ward.D2",
                   cluster_rows = FALSE,
                   cluster_cols = FALSE)

pheatmap::pheatmap(male_agg_mat, 
                   scale="none",
                   #clustering_method="ward.D2",
                   cluster_rows = FALSE,
                   cluster_cols = FALSE)

pheatmap::pheatmap(female_agg_mat, 
                   scale="row",
                   #clustering_method="ward.D2",
                   cluster_rows = FALSE,
                   cluster_cols = FALSE)

pheatmap::pheatmap(female_agg_mat, 
                   scale="column",
                   #clustering_method="ward.D2",
                   cluster_rows = FALSE,
                   cluster_cols = FALSE)

pheatmap::pheatmap(female_agg_mat, 
                   scale="none",
                   #clustering_method="ward.D2",
                   cluster_rows = FALSE,
                   cluster_cols = FALSE)

ComplexHeatmap version

## pheatmap calculates Z scores for plotting values
scale_matrix_by_cols <- function (x) 
{
    m = apply(x, 1, mean, na.rm = T)
    s = apply(x, 1, sd, na.rm = T)
    return((x - m)/s)
}

## calculate z score by col
female_agg_mat_scaled <- t(as.matrix(scale_matrix_by_cols(t(female_agg_mat))))
male_agg_mat_scaled <- t(as.matrix(scale_matrix_by_cols(t(male_agg_mat))))
## reorder cols
female_agg_mat_scaled <- female_agg_mat_scaled[match(levels(gene_module_df_sex$module), row.names(female_agg_mat_scaled)), ]
male_agg_mat_scaled <- male_agg_mat_scaled[match(levels(gene_module_df_sex$module), row.names(male_agg_mat_scaled)), ]

## reorder based on clusters
genes_per_module <- genes_per_module[match(levels(gene_module_df_sex$module), row.names(genes_per_module)), ]

## change names for row names to include "module " at the begining of them
row.names(female_agg_mat_scaled) <- stringr::str_c("Module ", row.names(female_agg_mat_scaled))
row.names(male_agg_mat_scaled) <- stringr::str_c("Module ", row.names(male_agg_mat_scaled))

## add number of cells to the rownames for the module
for(i in seq_along(genes_per_module$Freq)){
  row.names(female_agg_mat_scaled)[i] <- stringr::str_c(row.names(female_agg_mat_scaled)[i]," (n = " ,genes_per_module$Freq[i], ")")
}
for(i in seq_along(genes_per_module$Freq)){
  row.names(male_agg_mat_scaled)[i] <- stringr::str_c(row.names(male_agg_mat_scaled)[i]," (n = " ,genes_per_module$Freq[i], ")")
}

## add annotation:
#heatmap_annotation <- HeatmapAnnotation(df = cluster_anno,
#                                         col = list(
# Identity = c(Male="#016c00", Female="#a52b1e", Asexual= "#0052c5", Committed = "#f2eb23")),
#                                         annotation_legend_param = list(Median_Pseudotime_of_Cluster = list(direction = "horizontal"), Identity = list(nrow = 1)))

library(ComplexHeatmap)
library(RColorBrewer)
modules_heatmap_female <- Heatmap(female_agg_mat_scaled,
        column_order = NULL,
        #row_order = row.names(female_agg_mat_scaled)[module_dendro$order],
        #clustering_method_rows = "ward.D2",
        #bottom_annotation = heatmap_annotation,
        col = colorRampPalette(rev(brewer.pal(n = 7, name =
  "RdYlBu")))(100), 
        heatmap_legend_param = list(direction = "horizontal"))

modules_heatmap_male <- Heatmap(male_agg_mat_scaled,
        column_order = NULL,
        #row_order = module_dendro$order,
        #clustering_method_rows = "ward.D2",
        #bottom_annotation = heatmap_annotation,
        col = colorRampPalette(rev(brewer.pal(n = 7, name =
  "RdYlBu")))(100), 
        heatmap_legend_param = list(direction = "horizontal"))

draw(modules_heatmap_female, merge_legend = TRUE, heatmap_legend_side = "bottom", 
    annotation_legend_side = "bottom")
draw(modules_heatmap_male, merge_legend = TRUE, heatmap_legend_side = "bottom", 
    annotation_legend_side = "bottom")

## https://www.biostars.org/p/380544/ 

4 bin width

## Define male and female branch cells
# male
male_branch_meta_data <- tenx.mutant.integrated.sex@meta.data[which(tenx.mutant.integrated.sex@meta.data$sex == "pre-det" | tenx.mutant.integrated.sex@meta.data$sex == "male"), ]

male_branch_meta_data <- data.frame(cell_id = rownames(male_branch_meta_data), pt = male_branch_meta_data$PT_LineageMale)

male_cell_group_df <- male_branch_meta_data

#female
female_branch_meta_data <- tenx.mutant.integrated.sex@meta.data[which(tenx.mutant.integrated.sex@meta.data$sex == "pre-det" | tenx.mutant.integrated.sex@meta.data$sex == "female"), ]

female_branch_meta_data <- data.frame(cell_id = rownames(female_branch_meta_data), pt = female_branch_meta_data$PT_LineageFemale)

female_cell_group_df <- female_branch_meta_data

## what's the range of values for each pt?

range(female_cell_group_df$pt)
range(male_cell_group_df$pt)
## make bin widths
# make a new col for annotation
female_cell_group_df$pt_bin <- NA
for(i in seq(4,68,4)){
  female_cell_group_df$pt_bin[which(female_cell_group_df$pt < i & female_cell_group_df$pt >= (i-4))] <- i
}

male_cell_group_df$pt_bin <- NA
for(i in seq(4,68,4)){
  male_cell_group_df$pt_bin[which(male_cell_group_df$pt < i & male_cell_group_df$pt >= (i-4))] <- i
}
# then remove old pt values
male_cell_group_df <- male_cell_group_df[ ,-2]
female_cell_group_df <- female_cell_group_df[ ,-2]
## The original object contains all cells, we just want wild-type so let's subset out gene_module_df and cell_group_df accordingly

## male
## subset our cell group df to keep only these cells
male_cell_group_df <- male_cell_group_df[which(male_cell_group_df$cell_id %in% male_cells),]
## make a new dataframe for cell groups - it is crucial to refactor otherwise aggregate_gene_expression thinks it's out of bounds  
male_cell_group_df <- data.frame(cell=as.character(factor(male_cell_group_df$cell_id)), cell_group=factor(male_cell_group_df$pt_bin))  
## aggregate expression
male_agg_mat <- aggregate_gene_expression(male.monocle.object, gene_module_df_sex, male_cell_group_df, exclude.na = FALSE)

## female
## subset out only male and pre determination cells
## subset our cell group df to keep only these cells
female_cell_group_df <- female_cell_group_df[which(female_cell_group_df$cell_id %in% female_cells),]
## make a new dataframe for cell groups - it is crucial to refactor otherwise aggregate_gene_expression thinks it's out of bounds  
female_cell_group_df <- data.frame(cell=as.character(factor(female_cell_group_df$cell_id)), cell_group=factor(female_cell_group_df$pt_bin))  
## aggregate expression
female_agg_mat <- aggregate_gene_expression(female.monocle.object, gene_module_df_sex, female_cell_group_df, exclude.na = FALSE)
## use these clusters to reorder the modules
male_agg_mat <- male_agg_mat[match(levels(gene_module_df_sex$module), row.names(male_agg_mat)), ]
female_agg_mat <- female_agg_mat[match(levels(gene_module_df_sex$module), row.names(female_agg_mat)), ]

pheatmap::pheatmap(male_agg_mat, 
                   scale="row",
                   #clustering_method="ward.D2",
                   cluster_rows = FALSE,
                   cluster_cols = FALSE)

pheatmap::pheatmap(female_agg_mat, 
                   scale="row",
                   #clustering_method="ward.D2",
                   cluster_rows = FALSE,
                   cluster_cols = FALSE)

expression of modules in mutant cells (side panels)

male

## make monocle object with mutants
## extract data
mutant_cells_male <- rownames(tenx.mutant.integrated.sex@meta.data[which(tenx.mutant.integrated.sex@meta.data$genotype_combined == "Mutant" & tenx.mutant.integrated.sex@meta.data$sex == "male"),])

## make a new Seurat of this
seurat.object <-SubsetData(tenx.mutant.integrated.sex, cells = mutant_cells_male)

## make new counts and pheno:
## the reason we use the integrated and then subsetted is because these cells have been normalised whereas the cells in pb_sex_filtered have not been normalised (well they have but with doublets in them)
data <- as(as.matrix(GetAssayData(seurat.object, assay = "RNA", slot = "data")), 'sparseMatrix')
pd <- data.frame(seurat.object@meta.data)
fData <- data.frame(gene_short_name = row.names(data), row.names = row.names(data))

## Construct monocle cds
monocle.object.mutants.male <- new_cell_data_set(expression_data = data, cell_metadata = pd, gene_metadata = fData)

## preprocess
monocle.object.mutants.male = preprocess_cds(monocle.object.mutants.male, num_dim = 50, norm_method = "none")
### if using integrated data:
# norm_method = "none", alignment_group = "~ experiment"

## make a cell group dataframe for aggregating expression values:

mutant_cell_group_df <- data.frame(cell = row.names(monocle.object.mutants.male@colData), cell_group = monocle.object.mutants.male@colData$identity_updated)

## aggregate expression
mutant_male_agg_mat <- aggregate_gene_expression(monocle.object.mutants.male, gene_module_df_sex, mutant_cell_group_df)

plot

mutant_male_agg_mat <- mutant_male_agg_mat[match(levels(gene_module_df_sex$module), row.names(mutant_male_agg_mat)), ]

pheatmap::pheatmap(mutant_male_agg_mat, 
                   scale="column",
                   #clustering_method="ward.D2",
                   cluster_rows = FALSE,
                   cluster_cols = TRUE) + theme(legend.position = "bottom")
mutant_male_agg_mat <- mutant_male_agg_mat[match(levels(gene_module_df_sex$module), row.names(mutant_male_agg_mat)), ]

pheatmap::pheatmap(mutant_male_agg_mat, 
                   scale="column",
                   #clustering_method="ward.D2",
                   cluster_rows = FALSE,
                   cluster_cols = TRUE) + theme(legend.position = "bottom")

female

## make monocle object with mutants
## extract data
mutant_cells_female <- rownames(tenx.mutant.integrated.sex@meta.data[which(tenx.mutant.integrated.sex@meta.data$genotype_combined == "Mutant" & tenx.mutant.integrated.sex@meta.data$sex == "female"),])

## make a new Seurat of this
seurat.object <-SubsetData(tenx.mutant.integrated.sex, cells = mutant_cells_female)

## make new counts and pheno:
## the reason we use the integrated and then subsetted is because these cells have been normalised whereas the cells in pb_sex_filtered have not been normalised (well they have but with doublets in them)
data <- as(as.matrix(GetAssayData(seurat.object, assay = "RNA", slot = "data")), 'sparseMatrix')
pd <- data.frame(seurat.object@meta.data)
fData <- data.frame(gene_short_name = row.names(data), row.names = row.names(data))

## Construct monocle cds
monocle.object.mutants.female <- new_cell_data_set(expression_data = data, cell_metadata = pd, gene_metadata = fData)

## preprocess
monocle.object.mutants.female = preprocess_cds(monocle.object.mutants.female, num_dim = 50, norm_method = "none")
### if using integrated data:
# norm_method = "none", alignment_group = "~ experiment"

## make a cell group dataframe for aggregating expression values:
mutant_cell_group_df <- data.frame(cell = row.names(monocle.object.mutants.female@colData), cell_group = monocle.object.mutants.female@colData$identity_updated)

## aggregate expression
mutant_female_agg_mat <- aggregate_gene_expression(monocle.object.mutants.female, gene_module_df_sex, mutant_cell_group_df)

plot

mutant_female_agg_mat <- mutant_female_agg_mat[match(levels(gene_module_df_sex$module), row.names(mutant_female_agg_mat)), ]

pheatmap::pheatmap(mutant_female_agg_mat, 
                   scale="column",
                   #clustering_method="ward.D2",
                   cluster_rows = FALSE,
                   cluster_cols = FALSE) + theme(legend.position = "bottom")
```r
## landmark genes (genes of interest)
# AP2G - PBANKA-1437500
# AP2 - PBANKA-0909600 - from poran paper
# AP2G-2 - PBANKA-1034300 
list_of_mutant_genes <- c(\PBANKA-0828000\, \PBANKA-1302700\, \PBANKA-1447900\, \PBANKA-0102400\, \PBANKA-0716500\, \PBANKA-1435200\, \PBANKA-1418100\, \PBANKA-1144800\, \PBANKA-0902300\, \PBANKA-0413400\, \PBANKA-1454800\)

list_of_genes_of_interest <- c(\PBANKA-1437500\, \PBANKA-0909600\,\PBANKA-1034300\, \PBANKA-0828000\, \PBANKA-1302700\, \PBANKA-1447900\, \PBANKA-0102400\, \PBANKA-0716500\, \PBANKA-1435200\, \PBANKA-1418100\, \PBANKA-1144800\, \PBANKA-0902300\, \PBANKA-0413400\, \PBANKA-1454800\)
##make df for genes of interest
genes_of_interest <- data.frame(gene = list_of_genes_of_interest, group = c(1:length(list_of_genes_of_interest)))

## aggregate expression
## make plotting df
agg_mat_genes_of_interest <- aggregate_gene_expression(monocle.object, genes_of_interest, cell_group_df)

row.names(agg_mat_genes_of_interest) <- genes_of_interest$gene

#row.names(agg_mat_genes_of_interest) <- factor(row.names(agg_mat_genes_of_interest), levels = row.names(agg_mat_genes_of_interest)[module_dendro$order])
agg_mat_genes_of_interest <- agg_mat_genes_of_interest[,match(rownames(cluster_anno), colnames(agg_mat_genes_of_interest))]

pheatmap::pheatmap(agg_mat_genes_of_interest, 
                   scale=\row\,
                   cluster_cols = FALSE,
                   cluster_rows = FALSE,
                   clustering_method=\ward.D2\, 
                   annotation_col = cluster_anno, 
                   annotation_colors = annotation_colours)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


#### for particular genes (lower panel)


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuIyMgbGFuZG1hcmsgZ2VuZXMgKGdlbmVzIG9mIGludGVyZXN0KVxuIyBBUDJHIC0gUEJBTktBLTE0Mzc1MDBcbiMgQVAyIC0gUEJBTktBLTA5MDk2MDAgLSBmcm9tIHBvcmFuIHBhcGVyXG4jIEFQMkctMiAtIFBCQU5LQS0xMDM0MzAwIFxubGlzdF9vZl9tdXRhbnRfZ2VuZXMgPC0gYyhcIlBCQU5LQS0wODI4MDAwXCIsIFwiUEJBTktBLTEzMDI3MDBcIiwgXCJQQkFOS0EtMTQ0NzkwMFwiLCBcIlBCQU5LQS0wMTAyNDAwXCIsIFwiUEJBTktBLTA3MTY1MDBcIiwgXCJQQkFOS0EtMTQzNTIwMFwiLCBcIlBCQU5LQS0xNDE4MTAwXCIsIFwiUEJBTktBLTExNDQ4MDBcIiwgXCJQQkFOS0EtMDkwMjMwMFwiLCBcIlBCQU5LQS0wNDEzNDAwXCIsIFwiUEJBTktBLTE0NTQ4MDBcIilcblxubGlzdF9vZl9nZW5lc19vZl9pbnRlcmVzdCA8LSBjKFwiUEJBTktBLTE0Mzc1MDBcIiwgXCJQQkFOS0EtMDkwOTYwMFwiLFwiUEJBTktBLTEwMzQzMDBcIiwgXCJQQkFOS0EtMDgyODAwMFwiLCBcIlBCQU5LQS0xMzAyNzAwXCIsIFwiUEJBTktBLTE0NDc5MDBcIiwgXCJQQkFOS0EtMDEwMjQwMFwiLCBcIlBCQU5LQS0wNzE2NTAwXCIsIFwiUEJBTktBLTE0MzUyMDBcIiwgXCJQQkFOS0EtMTQxODEwMFwiLCBcIlBCQU5LQS0xMTQ0ODAwXCIsIFwiUEJBTktBLTA5MDIzMDBcIiwgXCJQQkFOS0EtMDQxMzQwMFwiLCBcIlBCQU5LQS0xNDU0ODAwXCIpXG4jI21ha2UgZGYgZm9yIGdlbmVzIG9mIGludGVyZXN0XG5nZW5lc19vZl9pbnRlcmVzdCA8LSBkYXRhLmZyYW1lKGdlbmUgPSBsaXN0X29mX2dlbmVzX29mX2ludGVyZXN0LCBncm91cCA9IGMoMTpsZW5ndGgobGlzdF9vZl9nZW5lc19vZl9pbnRlcmVzdCkpKVxuXG4jIyBhZ2dyZWdhdGUgZXhwcmVzc2lvblxuIyMgbWFrZSBwbG90dGluZyBkZlxuYWdnX21hdF9nZW5lc19vZl9pbnRlcmVzdCA8LSBhZ2dyZWdhdGVfZ2VuZV9leHByZXNzaW9uKG1vbm9jbGUub2JqZWN0LCBnZW5lc19vZl9pbnRlcmVzdCwgY2VsbF9ncm91cF9kZilcblxucm93Lm5hbWVzKGFnZ19tYXRfZ2VuZXNfb2ZfaW50ZXJlc3QpIDwtIGdlbmVzX29mX2ludGVyZXN0JGdlbmVcblxuI3Jvdy5uYW1lcyhhZ2dfbWF0X2dlbmVzX29mX2ludGVyZXN0KSA8LSBmYWN0b3Iocm93Lm5hbWVzKGFnZ19tYXRfZ2VuZXNfb2ZfaW50ZXJlc3QpLCBsZXZlbHMgPSByb3cubmFtZXMoYWdnX21hdF9nZW5lc19vZl9pbnRlcmVzdClbbW9kdWxlX2RlbmRybyRvcmRlcl0pXG5hZ2dfbWF0X2dlbmVzX29mX2ludGVyZXN0IDwtIGFnZ19tYXRfZ2VuZXNfb2ZfaW50ZXJlc3RbLG1hdGNoKHJvd25hbWVzKGNsdXN0ZXJfYW5ubyksIGNvbG5hbWVzKGFnZ19tYXRfZ2VuZXNfb2ZfaW50ZXJlc3QpKV1cblxucGhlYXRtYXA6OnBoZWF0bWFwKGFnZ19tYXRfZ2VuZXNfb2ZfaW50ZXJlc3QsIFxuICAgICAgICAgICAgICAgICAgIHNjYWxlPVwicm93XCIsXG4gICAgICAgICAgICAgICAgICAgY2x1c3Rlcl9jb2xzID0gRkFMU0UsXG4gICAgICAgICAgICAgICAgICAgY2x1c3Rlcl9yb3dzID0gRkFMU0UsXG4gICAgICAgICAgICAgICAgICAgY2x1c3RlcmluZ19tZXRob2Q9XCJ3YXJkLkQyXCIsIFxuICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25fY29sID0gY2x1c3Rlcl9hbm5vLCBcbiAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uX2NvbG9ycyA9IGFubm90YXRpb25fY29sb3VycylcbmBgYCJ9 -->

```r
## landmark genes (genes of interest)
# AP2G - PBANKA-1437500
# AP2 - PBANKA-0909600 - from poran paper
# AP2G-2 - PBANKA-1034300 
list_of_mutant_genes <- c("PBANKA-0828000", "PBANKA-1302700", "PBANKA-1447900", "PBANKA-0102400", "PBANKA-0716500", "PBANKA-1435200", "PBANKA-1418100", "PBANKA-1144800", "PBANKA-0902300", "PBANKA-0413400", "PBANKA-1454800")

list_of_genes_of_interest <- c("PBANKA-1437500", "PBANKA-0909600","PBANKA-1034300", "PBANKA-0828000", "PBANKA-1302700", "PBANKA-1447900", "PBANKA-0102400", "PBANKA-0716500", "PBANKA-1435200", "PBANKA-1418100", "PBANKA-1144800", "PBANKA-0902300", "PBANKA-0413400", "PBANKA-1454800")
##make df for genes of interest
genes_of_interest <- data.frame(gene = list_of_genes_of_interest, group = c(1:length(list_of_genes_of_interest)))

## aggregate expression
## make plotting df
agg_mat_genes_of_interest <- aggregate_gene_expression(monocle.object, genes_of_interest, cell_group_df)

row.names(agg_mat_genes_of_interest) <- genes_of_interest$gene

#row.names(agg_mat_genes_of_interest) <- factor(row.names(agg_mat_genes_of_interest), levels = row.names(agg_mat_genes_of_interest)[module_dendro$order])
agg_mat_genes_of_interest <- agg_mat_genes_of_interest[,match(rownames(cluster_anno), colnames(agg_mat_genes_of_interest))]

pheatmap::pheatmap(agg_mat_genes_of_interest, 
                   scale="row",
                   cluster_cols = FALSE,
                   cluster_rows = FALSE,
                   clustering_method="ward.D2", 
                   annotation_col = cluster_anno, 
                   annotation_colors = annotation_colours)

complex heat map

## aggregate gene expression
agg_mat_genes_of_interest <- aggregate_gene_expression(monocle.object, genes_of_interest, df_all_cells)

agg_mat_genes_of_interest <- as.matrix(agg_mat_genes_of_interest)

## make heatmap
modules_heatmap <- Heatmap(agg_mat_genes_of_interest,
        column_order = NULL,
        cluster_columns = FALSE,
        cluster_rows = FALSE,
        show_column_dend = FALSE,
        column_labels = rep("", ncol(agg_mat_all_cells_matrix)),
        #row_order = module_dendro$order,
        clustering_method_columns = "ward.D2",
        bottom_annotation = heatmap_annotation,
        col = colorRampPalette(rev(brewer.pal(n = 7, name =
  "RdYlBu")))(100), 
        heatmap_legend_param = list(direction = "horizontal"))

## print
draw(modules_heatmap, merge_legend = TRUE, heatmap_legend_side = "bottom", 
    annotation_legend_side = "bottom")
```r
DoHeatmap(seurat.object, features = top10$gene) + NoLegend()

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


Using Seurat to visualise cells

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuIyBmaW5kIG1hcmtlcnMgZm9yIGV2ZXJ5IGNsdXN0ZXIgY29tcGFyZWQgdG8gYWxsIHJlbWFpbmluZyBjZWxscywgcmVwb3J0IG9ubHkgdGhlIHBvc2l0aXZlIG9uZXNcbnRlbngubXV0YW50LmludGVncmF0ZWQuc2V4Lm1hcmtlcnMgPC0gRmluZEFsbE1hcmtlcnModGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXgsIG9ubHkucG9zID0gVFJVRSwgbWluLnBjdCA9IDAuMjUsIGxvZ2ZjLnRocmVzaG9sZCA9IDAuMjUpXG50ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleC5tYXJrZXJzICU+JSBncm91cF9ieShjbHVzdGVyKSAlPiUgdG9wX24obiA9IDIsIHd0ID0gYXZnX2xvZ0ZDKVxuYGBgIn0= -->

```r
# find markers for every cluster compared to all remaining cells, report only the positive ones
tenx.mutant.integrated.sex.markers <- FindAllMarkers(tenx.mutant.integrated.sex, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25)
tenx.mutant.integrated.sex.markers %>% group_by(cluster) %>% top_n(n = 2, wt = avg_logFC)
top10 <- tenx.mutant.integrated.sex.markers %>% group_by(cluster) %>% top_n(n = 10, wt = avg_logFC)
DoHeatmap(tenx.mutant.integrated.sex, features = top10$gene) + NoLegend()

But we also have the old pt values that we can use in the seurat object ie FeaturePlot(tenx.mutant.integrated.sex, reduction = “pca”, pt.size = 0.01, features = “old_pt_values”)

So let’s plot a heatmap where we plot: (x) all cells vs. (y) genes arranged by module that they belong to.

add an old pt annotation to the top

prepare data:

```r
## aggregate gene expression
agg_mat_genes_of_interest <- aggregate_gene_expression(monocle.object, genes_of_interest, df_all_cells)

agg_mat_genes_of_interest <- as.matrix(agg_mat_genes_of_interest)

## make heatmap
modules_heatmap <- Heatmap(agg_mat_genes_of_interest,
        column_order = NULL,
        cluster_columns = FALSE,
        cluster_rows = FALSE,
        show_column_dend = FALSE,
        column_labels = rep(\\, ncol(agg_mat_all_cells_matrix)),
        #row_order = module_dendro$order,
        clustering_method_columns = \ward.D2\,
        bottom_annotation = heatmap_annotation,
        col = colorRampPalette(rev(brewer.pal(n = 7, name =
  \RdYlBu\)))(100), 
        heatmap_legend_param = list(direction = \horizontal\))

## print
draw(modules_heatmap, merge_legend = TRUE, heatmap_legend_side = \bottom\, 
    annotation_legend_side = \bottom\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuRG9IZWF0bWFwKHNldXJhdC5vYmplY3QsIGZlYXR1cmVzID0gdG9wMTAkZ2VuZSkgKyBOb0xlZ2VuZCgpXG5gYGAifQ== -->

```r
DoHeatmap(seurat.object, features = top10$gene) + NoLegend()
## aggregate gene expression
agg_mat_genes_of_interest <- aggregate_gene_expression(monocle.object, genes_of_interest, df_all_cells)

agg_mat_genes_of_interest <- as.matrix(agg_mat_genes_of_interest)

## make heatmap
modules_heatmap <- Heatmap(agg_mat_genes_of_interest,
        column_order = NULL,
        cluster_columns = FALSE,
        cluster_rows = FALSE,
        show_column_dend = FALSE,
        column_labels = rep("", ncol(agg_mat_all_cells_matrix)),
        #row_order = module_dendro$order,
        clustering_method_columns = "ward.D2",
        bottom_annotation = heatmap_annotation,
        col = colorRampPalette(rev(brewer.pal(n = 7, name =
  "RdYlBu")))(100), 
        heatmap_legend_param = list(direction = "horizontal"))

## print
draw(modules_heatmap, merge_legend = TRUE, heatmap_legend_side = "bottom", 
    annotation_legend_side = "bottom")

Expression of CCP2 and MG1 by each genotype and each sex

# ccp2 - "PBANKA-1319500" - female 820
# MG1 - "PBANKA-0416100" - male 820

## make a custom dataframe:
marker_820_df <- as.data.frame(t(as.data.frame(tenx.mutant.integrated.sex@assays$RNA@data[c("PBANKA-1319500", "PBANKA-0416100"), ], stringsAsFactors=F)))
marker_820_df$cell_id <- row.names(marker_820_df)
sex_id <- data.frame(sex_at = tenx.mutant.integrated.sex@meta.data$at_sex, genotype = tenx.mutant.integrated.sex@meta.data$identity_updated ,cell_id = row.names(tenx.mutant.integrated.sex@meta.data))
marker_820_df <- merge(marker_820_df, sex_id, by = "cell_id")

ggplot(marker_820_df, aes(fill=sex_at, y=`PBANKA-1319500`, x=genotype)) + 
    geom_violin() +
  geom_jitter(shape=16, position=position_jitter(0.2)) +
  theme_classic() +
  theme(axis.text.x = element_text(angle = 90))
#tenx.mutant.integrated.sex@meta.data[which(tenx.mutant.integrated.sex@meta.data$sex == "pre-det" | tenx.mutant.integrated.sex@meta.data$sex == "female"), ]


VlnPlot(tenx.mutant.integrated.sex, group.by = "identity_updated", split.by = "at_sex", features = c("PBANKA-1319500"), split.plot = TRUE)

VlnPlot(tenx.mutant.integrated.sex, group.by = "identity_updated", split.by = "at_sex", features = c("PBANKA-0416100"), split.plot = TRUE)

Differential expression

Re-cluster the data so we have very course grain clusters

## find new clusters
tenx.mutant.integrated.sex <- FindClusters(tenx.mutant.integrated.sex, resolution = 1, random.seed = 42, algorithm = 2)

## plot the graph
DimPlot(tenx.mutant.integrated.sex, reduction = "umapoptimised_post_repca", label = TRUE, repel = TRUE, label.size = 5, pt.size = 0.5, group.by = "integrated_snn_res.1") +
  coord_fixed() +
  theme_void() +
  theme(legend.position = "bottom") +
  guides(colour=guide_legend(nrow=3,byrow=TRUE, override.aes = list(size=4)))
VlnPlot(tenx.mutant.integrated.sex, features = c("PT_Female_UMAP", "PT_Male_UMAP"))

Show representation of genotypes per cluster

prep for dotplot

```r
## plot
dot_plot_identity <- ggplot(dot_plot_merged, aes(y = factor(cluster), x = factor(identity))) +
      ## make into a dot plot
      geom_point(aes(colour=value, size=raw_number)) + 
      scale_color_gradient(low=\blue\, high=\red\, limits=c( 0, max(dot_plot_df_pc_melted$value)), na.value=\white\) +
      #change the colours
      scale_colour_viridis(option = \inferno\, guide = \colourbar\, na.value=\white\) +
      theme_classic() +
      theme(panel.grid.major=element_blank(), panel.grid.minor=element_blank(), text=element_text(size=16,  family=\Arial\)) +
      ylab(\Cluster\) +
      xlab(\Identity\) +
      theme(axis.text.x=element_text(size=12, angle=45, hjust=1, vjust=1), axis.text.y=element_text(size=12,), legend.position = \bottom\, plot.margin = unit(c(1,3,1,3), \lines\)) +
    ## annotate males
    geom_hline(aes(yintercept = 2.5)) +
    ## annotate females
    geom_hline(aes(yintercept = 7.5)) +
    ## annotate pheno 1
    geom_vline(aes(xintercept = 4.5)) +
    ## annotate pheno 2
    geom_vline(aes(xintercept = 5.5)) +    
    ## annotate pheno 3
    geom_vline(aes(xintercept = 7.5)) +
    ## annotate pheno 4
    geom_vline(aes(xintercept = 11.5))

## print
print(dot_plot_identity)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


plot

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxud3RfY2VsbHMgPC0gcm93Lm5hbWVzKHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YVt3aGljaCh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGEkaWRlbnRpdHlfY29tYmluZWQgPT0gXFxXVFxcIHwgdGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXhAbWV0YS5kYXRhJGlkZW50aXR5X2NvbWJpbmVkID09IFxcV1RfMTBYXFwpLCBdKVxuXG5tYWxlX2lubWF0dXJlX2NlbGxzIDwtIHJvdy5uYW1lcyh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGFbd2hpY2godGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXhAbWV0YS5kYXRhJGlkZW50aXR5X2NvbWJpbmVkID09IFxcV1RcXCB8IHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YSRpZGVudGl0eV9jb21iaW5lZCA9PSBcXFdUXzEwWFxcKSwgXSlcblxuXG5cbmVhcmx5X3d0X2NlbGxzIDwtIHJvdy5uYW1lcyh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGFbd2hpY2godGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXhAbWV0YS5kYXRhJGlkZW50aXR5X2NvbWJpbmVkID09IFxcV1RcXCAmJiB0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGEkUFRfTGluZWFnZUZlbWFsZSA8IDQ2KSwgXSlcblxuRmluZE1hcmtlcnModGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXgsIGNlbGxzLjEgPSAsIGNlbGxzLjIgPSApXG5gYGBcbmBgYCJ9 -->

```r
```r
wt_cells <- row.names(tenx.mutant.integrated.sex@meta.data[which(tenx.mutant.integrated.sex@meta.data$identity_combined == \WT\ | tenx.mutant.integrated.sex@meta.data$identity_combined == \WT_10X\), ])

male_inmature_cells <- row.names(tenx.mutant.integrated.sex@meta.data[which(tenx.mutant.integrated.sex@meta.data$identity_combined == \WT\ | tenx.mutant.integrated.sex@meta.data$identity_combined == \WT_10X\), ])



early_wt_cells <- row.names(tenx.mutant.integrated.sex@meta.data[which(tenx.mutant.integrated.sex@meta.data$identity_combined == \WT\ && tenx.mutant.integrated.sex@meta.data$PT_LineageFemale < 46), ])

FindMarkers(tenx.mutant.integrated.sex, cells.1 = , cells.2 = )

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->





cut off and plot

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxucHJlX2JyYW5jaF9jZWxscyA8LSBjKDIsMylcbmlubWF0dXJlX21hbGVfY2VsbHMgPC0gYygpXG5pbm1hdHVyZV9mZW1hbGVfY2VsbHMgPC1cbm1hdHVyZV9tYWxlX2NlbGxzIDwtIFxubWF0dXJlX2ZlbWFsZV9jZWxscyA8LSBcblxuIyMgcGxvdCB0aGUgZ3JhcGhcbkRpbVBsb3QodGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXgsIHJlZHVjdGlvbiA9IFwidW1hcG9wdGltaXNlZF9wb3N0X3JlcGNhXCIsIGxhYmVsID0gVFJVRSwgcmVwZWwgPSBUUlVFLCBsYWJlbC5zaXplID0gNSwgcHQuc2l6ZSA9IDAuNSwgZ3JvdXAuYnkgPSBcImludGVncmF0ZWRfc25uX3Jlcy4xXCIpICtcbiAgY29vcmRfZml4ZWQoKSArXG4gIHRoZW1lX3ZvaWQoKSArXG4gIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IFwiYm90dG9tXCIpXG5gYGAifQ== -->

```r
pre_branch_cells <- c(2,3)
inmature_male_cells <- c()
inmature_female_cells <-
mature_male_cells <- 
mature_female_cells <- 

## plot the graph
DimPlot(tenx.mutant.integrated.sex, reduction = "umapoptimised_post_repca", label = TRUE, repel = TRUE, label.size = 5, pt.size = 0.5, group.by = "integrated_snn_res.1") +
  coord_fixed() +
  theme_void() +
  theme(legend.position = "bottom")
wt_cells <- row.names(tenx.mutant.integrated.sex@meta.data[which(tenx.mutant.integrated.sex@meta.data$identity_combined == "WT" | tenx.mutant.integrated.sex@meta.data$identity_combined == "WT_10X"), ])

male_inmature_cells <- row.names(tenx.mutant.integrated.sex@meta.data[which(tenx.mutant.integrated.sex@meta.data$identity_combined == "WT" | tenx.mutant.integrated.sex@meta.data$identity_combined == "WT_10X"), ])



early_wt_cells <- row.names(tenx.mutant.integrated.sex@meta.data[which(tenx.mutant.integrated.sex@meta.data$identity_combined == "WT" && tenx.mutant.integrated.sex@meta.data$PT_LineageFemale < 46), ])

FindMarkers(tenx.mutant.integrated.sex, cells.1 = , cells.2 = )

Generate New Clusters

We must now recalculate the clusters to gain a better understanding of the heterogeneity of the subset. Since using the previous clusters, the asexual cells obscured some of the variation.

## copy old clusters
tenx.mutant.integrated.sex <- AddMetaData(tenx.mutant.integrated.sex, tenx.mutant.integrated.sex@meta.data$seurat_clusters, col.name = "pre_sex_clusters")
## generate new clusters at various resolutions
tenx.mutant.integrated.sex <- FindNeighbors(tenx.mutant.integrated.sex, dims = 1:15)
tenx.mutant.integrated.sex <- FindClusters(tenx.mutant.integrated.sex, resolution = c(2,3,4,5,6), random.seed = 42, algorithm = 2)

Visualise

Choose Cluster Resolution

View the clusters at different resolutions to chose the appropraite resolution

## plot
DimPlot(tenx.mutant.integrated.sex, reduction = "umapoptimised_post_repca", label = TRUE, repel = TRUE, label.size = 5, pt.size = 0.5, group.by = "integrated_snn_res.2") +
  coord_fixed() +
  theme_void() +
  theme(legend.position = "bottom") +
  guides(colour=guide_legend(nrow=3,byrow=TRUE, override.aes = list(size=4)))

DimPlot(tenx.mutant.integrated.sex, reduction = "umapoptimised_post_repca", label = TRUE, repel = TRUE, label.size = 5, pt.size = 0.5, group.by = "integrated_snn_res.3") +
  coord_fixed() +
  theme_void() +
  theme(legend.position = "bottom") +
  guides(colour=guide_legend(nrow=3,byrow=TRUE, override.aes = list(size=4)))

DimPlot(tenx.mutant.integrated.sex, reduction = "umapoptimised_post_repca", label = TRUE, repel = TRUE, label.size = 5, pt.size = 0.5, group.by = "integrated_snn_res.4") +
  coord_fixed() +
  theme_void() +
  theme(legend.position = "bottom") +
  guides(colour=guide_legend(nrow=3,byrow=TRUE, override.aes = list(size=4)))

DimPlot(tenx.mutant.integrated.sex, reduction = "umapoptimised_post_repca", label = TRUE, repel = TRUE, label.size = 5, pt.size = 0.5, group.by = "integrated_snn_res.5") +
  coord_fixed() +
  theme_void() +
  theme(legend.position = "bottom") +
  guides(colour=guide_legend(nrow=3,byrow=TRUE, override.aes = list(size=4)))

DimPlot(tenx.mutant.integrated.sex, reduction = "umapoptimised_post_repca", label = TRUE, repel = TRUE, label.size = 5, pt.size = 0.5, group.by = "integrated_snn_res.6") +
  coord_fixed() +
  theme_void() +
  theme(legend.position = "bottom") +
  guides(colour=guide_legend(nrow=3,byrow=TRUE, override.aes = list(size=4)))

Go with 4 clusters

tenx.mutant.integrated.sex <- FindClusters(tenx.mutant.integrated.sex, resolution = 4, random.seed = 42, algorithm = 2)

DimPlot(tenx.mutant.integrated.sex, reduction = "umapoptimised_post_repca", label = TRUE, repel = TRUE, label.size = 5, pt.size = 0.5) +
  coord_fixed() +
  theme_void() +
  theme(legend.position = "bottom") +
  guides(colour=guide_legend(nrow=3,byrow=TRUE, override.aes = list(size=4)))

Original UMAP

You can also use the original UMAP projection

DimPlot(tenx.mutant.integrated.sex, label = TRUE, repel = TRUE, label.size = 5, pt.size = 0.5) +
  coord_fixed() +
  theme_void() +
  theme(legend.position = "bottom") +
  guides(colour=guide_legend(nrow=3,byrow=TRUE, override.aes = list(size=4)))

Representation

look at cluster representation

plot

## this function writes the next bit of code for you
ploty <- c()
for(i in seq_along(levels(tenx.mutant.integrated.sex@meta.data$seurat_clusters))){
  ploty <- paste0(ploty, "list_UMAPs_by_cluster[[", i, "]]", " + ")
}
```r
## plot
grid.arrange(list_UMAPs_by_cluster[[1]] , list_UMAPs_by_cluster[[2]] , list_UMAPs_by_cluster[[3]] , list_UMAPs_by_cluster[[4]] , list_UMAPs_by_cluster[[5]] , list_UMAPs_by_cluster[[6]] , list_UMAPs_by_cluster[[7]] , list_UMAPs_by_cluster[[8]] , list_UMAPs_by_cluster[[9]] , list_UMAPs_by_cluster[[10]] , list_UMAPs_by_cluster[[11]] , list_UMAPs_by_cluster[[12]] , list_UMAPs_by_cluster[[13]] , list_UMAPs_by_cluster[[14]] , list_UMAPs_by_cluster[[15]] , list_UMAPs_by_cluster[[16]] , list_UMAPs_by_cluster[[17]] , list_UMAPs_by_cluster[[18]] , list_UMAPs_by_cluster[[19]] , list_UMAPs_by_cluster[[20]] , list_UMAPs_by_cluster[[21]] , list_UMAPs_by_cluster[[22]] , list_UMAPs_by_cluster[[23]] , list_UMAPs_by_cluster[[24]] , list_UMAPs_by_cluster[[25]] , list_UMAPs_by_cluster[[26]] , list_UMAPs_by_cluster[[27]] , list_UMAPs_by_cluster[[28]] , list_UMAPs_by_cluster[[29]] , list_UMAPs_by_cluster[[30]] , list_UMAPs_by_cluster[[31]], ncol = 5)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuIyMgZm9yIGxvb3Agd2hpY2ggdGFrZXMgZWFjaCBjbHVzdGVyIGFuZCBtYWtlcyBhIGxpc3Qgb2YgY2VsbHMgYW5kIHRoZW4gcGxvdHMgYSBoaWdobGlnaHRlZCBwbG90IGFuZCBhZGRzIGl0IHRvIGEgbGlzdFxuXG4jIyBtYWtlIGEgZGYgb2YgdGhlIG51bWJlciBvZiBcbm5fcGVyX2NsdXN0ZXIgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZSh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGEkc2V1cmF0X2NsdXN0ZXJzKSlcbnJvd25hbWVzKG5fcGVyX2NsdXN0ZXIpIDwtIG5fcGVyX2NsdXN0ZXIkVmFyMVxubl9wZXJfY2x1c3RlciA8LSBuX3Blcl9jbHVzdGVyWywyXVxuXG4jIyBtYWtlIGEgYmxhbmsgbGlzdFxubGlzdF9VTUFQc19ieV9jbHVzdGVyIDwtIHZlY3Rvcihtb2RlID0gXCJsaXN0XCIsIGxlbmd0aCA9IGxlbmd0aChsZXZlbHModGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXhAbWV0YS5kYXRhJHNldXJhdF9jbHVzdGVycykpKVxuXG4jIyBmb3IgbG9vcFxuZm9yKGkgaW4gc2VxX2Fsb25nKGxldmVscyh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGEkc2V1cmF0X2NsdXN0ZXJzKSkpe1xuICAjIyBtYWtlIGEgbGlzdCBvZiBjZWxsc1xuICBsaXN0X29mX2NlbGxzIDwtIHJvd25hbWVzKHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YVt3aGljaCh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGEkc2V1cmF0X2NsdXN0ZXJzID09IGxldmVscyh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGEkc2V1cmF0X2NsdXN0ZXJzKVtpXSksIF0pXG4gIHVtYXBfcGxvdCA8LSBEaW1QbG90KHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4LCAgcmVkdWN0aW9uID0gXCJ1bWFwXCIsIGxhYmVsID0gRkFMU0UsIHJlcGVsID0gVFJVRSwgcHQuc2l6ZSA9IDAuMSwgY2VsbHMuaGlnaGxpZ2h0ID0gbGlzdF9vZl9jZWxscykgKyBcbiAgY29vcmRfZml4ZWQoKSArIFxuICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoXCIjMDAwMDAwXCIsIFwiI2Y1NGUxZVwiKSkgKyBcbiAgdGhlbWVfdm9pZCgpICsgXG4gIGxhYnModGl0bGUgPSBwYXN0ZShcImNsdXN0ZXJcIiwgbGV2ZWxzKHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YSRzZXVyYXRfY2x1c3RlcnMpW2ldLCBcIlxcblwiLCBcIihuID0gXCIsIG5fcGVyX2NsdXN0ZXJbaV0sXCIpXCIpKSArIFxuICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwgbGVnZW5kLnBvc2l0aW9uID0gXCJub25lXCIpXG4gICMjIGFkZCB0byB0aGUgbGlzdFxuICBsaXN0X1VNQVBzX2J5X2NsdXN0ZXJbW2ldXSA8LSB1bWFwX3Bsb3Rcbn1cbmBgYCJ9 -->

```r
## for loop which takes each cluster and makes a list of cells and then plots a highlighted plot and adds it to a list

## make a df of the number of 
n_per_cluster <- as.data.frame(table(tenx.mutant.integrated.sex@meta.data$seurat_clusters))
rownames(n_per_cluster) <- n_per_cluster$Var1
n_per_cluster <- n_per_cluster[,2]

## make a blank list
list_UMAPs_by_cluster <- vector(mode = "list", length = length(levels(tenx.mutant.integrated.sex@meta.data$seurat_clusters)))

## for loop
for(i in seq_along(levels(tenx.mutant.integrated.sex@meta.data$seurat_clusters))){
  ## make a list of cells
  list_of_cells <- rownames(tenx.mutant.integrated.sex@meta.data[which(tenx.mutant.integrated.sex@meta.data$seurat_clusters == levels(tenx.mutant.integrated.sex@meta.data$seurat_clusters)[i]), ])
  umap_plot <- DimPlot(tenx.mutant.integrated.sex,  reduction = "umap", label = FALSE, repel = TRUE, pt.size = 0.1, cells.highlight = list_of_cells) + 
  coord_fixed() + 
  scale_color_manual(values=c("#000000", "#f54e1e")) + 
  theme_void() + 
  labs(title = paste("cluster", levels(tenx.mutant.integrated.sex@meta.data$seurat_clusters)[i], "\n", "(n = ", n_per_cluster[i],")")) + 
  theme(plot.title = element_text(hjust = 0.5), legend.position = "none")
  ## add to the list
  list_UMAPs_by_cluster[[i]] <- umap_plot
}
```r
## hemberg uses gvisSankey in https://github.com/hemberg-lab/scmap/blob/3aa2bb487a80a946469393857cea6a6effc618fb/R/Utils.R code - so maybe update with this?

## make a dataframe that is the meta data
df_meta_data <- as.data.frame(tenx.mutant.integrated.sex@meta.data)

df_alluvial <- melt(table(data.frame(full_clusters = df_meta_data$pre_sex_clusters, sex_clusters = df_meta_data$seurat_clusters)))

## load required package
#library(ggalluvial)

## plot
ggplot(df_alluvial, aes(y = value, axis1 = full_clusters, axis2 = sex_clusters)) +
  geom_alluvium(aes(fill = sex_clusters),
                width = 0, knot.pos = 0, reverse = FALSE) +
  guides(fill = FALSE) +
  geom_stratum(width = 1/8, reverse = FALSE) +
  geom_text(stat = \stratum\, infer.label = TRUE, reverse = FALSE) +
  scale_x_continuous(breaks = 1:2, labels = c(\original cluster\, \Sex Cluster\)) +
  coord_flip() +
  ggtitle(\Cluster Identiity in full dataset vs. sex only\) +
    theme_classic()

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


#### Show correspondance with old clusters (Alluvium plot, Sankey diagram)


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuIyNUaGlzIGlzIHRoZSBzZXQgdXAgZm9yIHRoaXM6XG4jIyB0d28gY2x1c3RlcnMgdGhhdCBkaWZmZXJcbnRhYmxlKHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YSRzZXVyYXRfY2x1c3RlcnMsIHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YSRwcmVfc2V4X2NsdXN0ZXJzKVxuYGBgIn0= -->

```r
##This is the set up for this:
## two clusters that differ
table(tenx.mutant.integrated.sex@meta.data$seurat_clusters, tenx.mutant.integrated.sex@meta.data$pre_sex_clusters)
## hemberg uses gvisSankey in https://github.com/hemberg-lab/scmap/blob/3aa2bb487a80a946469393857cea6a6effc618fb/R/Utils.R code - so maybe update with this?

## make a dataframe that is the meta data
df_meta_data <- as.data.frame(tenx.mutant.integrated.sex@meta.data)

df_alluvial <- melt(table(data.frame(full_clusters = df_meta_data$pre_sex_clusters, sex_clusters = df_meta_data$seurat_clusters)))

## load required package
#library(ggalluvial)

## plot
ggplot(df_alluvial, aes(y = value, axis1 = full_clusters, axis2 = sex_clusters)) +
  geom_alluvium(aes(fill = sex_clusters),
                width = 0, knot.pos = 0, reverse = FALSE) +
  guides(fill = FALSE) +
  geom_stratum(width = 1/8, reverse = FALSE) +
  geom_text(stat = "stratum", infer.label = TRUE, reverse = FALSE) +
  scale_x_continuous(breaks = 1:2, labels = c("original cluster", "Sex Cluster")) +
  coord_flip() +
  ggtitle("Cluster Identiity in full dataset vs. sex only") +
    theme_classic()

Show representation of genotypes per cluster

prep for dotplot

```r
## plot
dot_plot_identity <- ggplot(dot_plot_merged, aes(y = factor(cluster), x = factor(identity))) +
      ## make into a dot plot
      geom_point(aes(colour=value, size=raw_number)) + 
      scale_color_gradient(low=\blue\, high=\red\, limits=c( 0, max(dot_plot_df_pc_melted$value)), na.value=\white\) +
      #change the colours
      scale_colour_viridis(option = \inferno\, guide = \colourbar\, na.value=\white\) +
      theme_classic() +
      theme(panel.grid.major=element_blank(), panel.grid.minor=element_blank(), text=element_text(size=16,  family=\Arial\)) +
      ylab(\Cluster\) +
      xlab(\Identity\) +
      theme(axis.text.x=element_text(size=12, angle=45, hjust=1, vjust=1), axis.text.y=element_text(size=12,), legend.position = \bottom\, plot.margin = unit(c(1,3,1,3), \lines\)) +
    ## annotate males
    geom_hline(aes(yintercept = 5.5)) +
    ## annotate females
    geom_hline(aes(yintercept = 20.5)) +
    ## annotate pheno 1
    geom_vline(aes(xintercept = 4.5)) +
    ## annotate pheno 2
    geom_vline(aes(xintercept = 5.5)) +    
    ## annotate pheno 3
    geom_vline(aes(xintercept = 7.5)) +
    ## annotate pheno 4
    geom_vline(aes(xintercept = 11.5))

## print
print(dot_plot_identity)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


plot

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyMgVGhpcyBzYXZlcyBldmVyeXRoaW5nIGluIHRoZSBnbG9iYWwgZW52aXJvbm1lbnQgZm9yIGVhc3kgcmVjYWxsIGxhdGVyXG4jc2F2ZS5pbWFnZShmaWxlID0gXFxHQ1NLT19TZXhfQnJhbmNoX0FuYWx5c2lzLlJEYXRhXFwpXG4jbG9hZChmaWxlID0gXFxHQ1NLT19TZXhfQnJhbmNoX0FuYWx5c2lzLlJEYXRhXFwpXG5gYGBcbmBgYCJ9 -->

```r
```r
## This saves everything in the global environment for easy recall later
#save.image(file = \GCSKO_Sex_Branch_Analysis.RData\)
#load(file = \GCSKO_Sex_Branch_Analysis.RData\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

























# Save and Export {.tabset}

save environment

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuIyMgVGhpcyBzYXZlcyBldmVyeXRoaW5nIGluIHRoZSBnbG9iYWwgZW52aXJvbm1lbnQgZm9yIGVhc3kgcmVjYWxsIGxhdGVyXG4jc2F2ZS5pbWFnZShmaWxlID0gXCJHQ1NLT19TZXhfQnJhbmNoX0FuYWx5c2lzLlJEYXRhXCIpXG4jbG9hZChmaWxlID0gXCJHQ1NLT19TZXhfQnJhbmNoX0FuYWx5c2lzLlJEYXRhXCIpXG5gYGAifQ== -->

```r
## This saves everything in the global environment for easy recall later
#save.image(file = "GCSKO_Sex_Branch_Analysis.RData")
#load(file = "GCSKO_Sex_Branch_Analysis.RData")

save modules

#gene_module_df_sex
write.csv(gene_module_df_sex, file = "../data_to_export/gene_module_df_sex.csv")
#save(pb_30k_sex_filtered, pb_sex_filtered, file = "Part_2_input.Rdata")

Save object(s)

## save integrated object to file
#saveRDS(tenx.mutant.integrated.sex, file = "../data_to_export/tenx.mutant.integrated.sex.processed.RDS") 
## restore the object
#tenx.mutant.integrated <- readRDS("../data_to_export/tenx.mutant.integrated.sex.processed.RDS")

Appendix

Useful info

## The tree for monocle is located here:
# monocle.object@principal_graph_aux[["UMAP"]]$dp_mst 
## see more info below in getAnywhere(learn_graph)
## in order to get a plottable dataframe of this:
#test <- as.data.frame(t(as.data.frame(monocle.object@principal_graph_aux[["UMAP"]]$dp_mst)))
#ggplot(test, aes(x = DIMUMAP_1, y = DIMUMAP_2)) + geom_point()

## the curves for slingshot are located here:
#as.data.frame(crv1@curves$curve1$s)
## so a plot can be made by:
#ggplot(as.data.frame(crv1@curves$curve3$s), aes(x= DIMUMAP_1, y = DIMUMAP_2)) + geom_line()

Functions Info

Seurat:::DoHeatmap
monocle:::plot_pseudotime_heatmap
## to understand how the line is stored
getAnywhere(learn_graph)
getAnywhere(aggregate_gene_expression)

so essentially it first takes the counts matrix and subsets it by your gene groups, then it sums the values - if you specify scale then it will calculate the z score of the transformed dataframe

A. Diffusion Map

construct map

## construct diffusion map
## http://www.bioconductor.org/packages/devel/bioc/vignettes/slingshot/inst/doc/vignette.html
## input is a transformed expression matrix (genes as cols and cells as rows)
dm <- DiffusionMap(t(as.data.frame(tenx.mutant.integrated.sex@assays$integrated@data)))

## extract meta data for plotting
df_meta_data <- (as.data.frame(tenx.mutant.integrated.sex@meta.data))

## make combined dataframe
rd2 <- as.data.frame(cbind(DC1 = dm$DC1, DC2 = dm$DC2, identity = as.factor(as.character(tenx.mutant.integrated.sex@meta.data$post_integration_clusters))))

## plot
ggplot(rd2, aes(x = DC1, y = DC2, colour = as.character(identity))) + geom_point(size = 1) + 
  theme(axis.ticks.y = element_blank()) + 
  theme_classic()
## make a density plot for real time correlations using kasia data
## make an annotation dataframe
anno_real_time <- data.frame(monocle.object@colData$cluster_colours_figure, monocle.object@colData$pt, monocle.object@colData$Prediction.Spearman._Kasia, row.names = rownames(monocle.object@colData))
names(anno_real_time) <- c("sex", "Pseudotime", "real_time")

## change the order of the cols (cells) in data frame
col.order <- rownames(anno_real_time[with(anno_real_time, order(sex, Pseudotime)), ])
anno_real_time <- anno_real_time[col.order,]

## add an "order" col to the dataframe to assist in plotting
anno_real_time$order <- c(1:nrow(anno_real_time))

#### plot density plot x
dens1 <- ggplot(anno_real_time, aes(x = order, fill = as.factor(real_time))) + 
                geom_density(alpha = 0.2) +
                #theme_void() + 
                #theme(legend.position = "none")
                ## add annotations for sex
      geom_rect(data = cluster_anno, mapping=aes(xmin=x1, xmax=x2, ymin=y1, ymax=y2, fill=Median_Pseudotime_of_Cluster), inherit.aes = FALSE) +
    scale_fill_viridis_c(option = "plasma") +
  ## flip coordinates 
  ## geoms below will use another color scale
    new_scale_fill() +
    geom_rect(data = cluster_anno, mapping=aes(xmin=Bx1, xmax=Bx2, ymin=By1, ymax=By2, fill=Identity), inherit.aes = FALSE) +
    scale_fill_manual(values = c("Male" ="#016c00", "Female"="#a52b1e", "Asexual"= "#0052c5", "Committed" = "#f2eb23"))

dens1

TO PUT BACK IN

A.

Put this in after you have decided what is actually male and female, also add a heatmap version below and figure out expression values (e.g. it’s a Z-score at the moment)

    ## subset males and females
## from the merge script:
#male_clusters <- c("22", "18", "9", "16")
#female_clusters <- c("19","24","20","3")

## subset males 
mutant_male_seurat <- subset(mutant_only_seurat, idents = c("22", "18", "9", "16"))

## subset females <- 
mutant_female_seurat <- subset(mutant_only_seurat, idents = c("19","24","20","3"))

   ## mca dataset of core genes

## read in data
df_mca_core_genes <- as.data.frame(read.csv("../data/Reference/mca_core_genes.csv",header = TRUE))

## subset male core genes
mca_male_core_genes <- df_mca_core_genes[which(df_mca_core_genes$Unique_Core == "Male"), ]$feature_symbol
## change underscore to dash
mca_male_core_genes <- gsub("_", "-", mca_male_core_genes)
mca_male_core_genes <- mca_male_core_genes[which(mca_male_core_genes %in% rownames(mutant_male_seurat@assays$RNA@data))]

## subset female core genes
mca_female_core_genes <- df_mca_core_genes[which(df_mca_core_genes$Unique_Core == "Female"), ]$feature_symbol
## change underscore to dash
mca_female_core_genes <- gsub("_", "-", mca_female_core_genes)
mca_female_core_genes <- mca_female_core_genes[which(mca_female_core_genes %in% rownames(mutant_female_seurat@assays$RNA@data))]

    ## plot

# PBANKA-0828000         GCSKO-3  GD1

# PBANKA-1302700       GCSKO-oom  MD1 
# PBANKA-1447900        GCSKO-29  MD2
# PBANKA-0102400         GCSKO-2  MD3 
# PBANKA-0716500        GCSKO-19  MD4 
# PBANKA-0413400    GCSKO-10_820  MD5

# PBANKA-1454800        GCSKO-21  FD1
# PBANKA-0902300        GCSKO-13  FD2
# PBANKA-1418100        GCSKO-17  FD3   
# PBANKA-1435200        GCSKO-20  FD4 

## reorder the levels so you can plot the clusters as you wish
#my_levels_male <- c("GCSKO-3", "GCSKO-2", "GCSKO-19", "GCSKO-10_820", "GCSKO-21", "GCSKO-13", "GCSKO-17", "GCSKO-20")
my_levels_male <- c("gd1", "md3", "md4", "md5", "fd1", "fd2", "fd3", "fd4")
#my_levels_female <- c("GCSKO-21", "GCSKO-13", "GCSKO-17", "GCSKO-20", "GCSKO-oom", "GCSKO-29", "GCSKO-2", "GCSKO-19", "GCSKO-10_820")
my_levels_female <- c("gd1", "fd1", "fd2", "fd3", "fd4", "md1", "md2", "md3", "md4", "md5")

## reorder the levels
mutant_male_seurat@meta.data$identity_name_updated <- factor(x = mutant_male_seurat@meta.data$identity_name_updated, levels = my_levels_male)
#mutant_male_seurat@meta.data$identity_updated <- factor(x = mutant_male_seurat@meta.data$identity_updated, levels = my_levels_male)
mutant_female_seurat@meta.data$identity_name_updated <- factor(x = mutant_female_seurat@meta.data$identity_name_updated, levels = my_levels_female)
#mutant_female_seurat@meta.data$identity_updated <- factor(x = mutant_female_seurat@meta.data$identity_updated, levels = my_levels_female)

## plot male
dot_plot_male <- DotPlot(mutant_male_seurat, assay = "RNA", features = mca_male_core_genes, group.by = "identity_combined") +
  theme_classic() +
  # change appearance and remove axis elements, and make room for arrows
  theme(axis.text.x = element_text(size=16, angle = 45, hjust=1,vjust=1, family = "Arial"), text=element_text(size=16, family="Arial"), legend.position = "bottom", legend.direction = "horizontal", legend.box = "vertical", plot.title = element_blank(), plot.margin = unit(c(1,3,1,3), "lines")) +
  #change the colours
  scale_colour_viridis(option = "inferno", guide = "colourbar", na.value="white", begin = 0, end = 1, direction = 1) +
  ## change x axis label
  labs(x = "MCA Core Genes", y = "Genotype", title = "Expression of Male MCA Core Genes in Male Mutant Cells") +
  ## change label on bottom of plot so we can indicate markers
  #scale_y_discrete(labels = c("gd1", "md3", "md4", "md5", "fd1", "fd2", "fd3", "fd4")) +
  coord_flip()

## view
print(dot_plot_male)


## plot female
dot_plot_female <- DotPlot(mutant_female_seurat, assay = "RNA", features = mca_female_core_genes, group.by = "identity_combined") +
  theme_classic() +
  # change appearance and remove axis elements, and make room for arrows
  theme(axis.text.x = element_text(size=16, angle = 45, hjust=1,vjust=1, family = "Arial"), text=element_text(size=16, family="Arial"), legend.position = "bottom", legend.direction = "horizontal", legend.box = "vertical", plot.title = element_blank(), plot.margin = unit(c(1,3,1,3), "lines")) +
  #change the colours
  scale_colour_viridis(option = "inferno", guide = "colourbar", na.value="white", begin = 0, end = 1, direction = 1) +
  ## change x axis label
  labs(x = "MCA Core Genes", y = "Genotype", title = "Expression of Female MCA Core Genes in Feale Mutant Cells") +
  ## change label on bottom of plot so we can indicate markers
  #scale_y_discrete(labels = c("fd1", "fd2", "fd3", "fd4","md1", "md2",  "md3", "md4", "md5")) +
coord_flip()

## view
print(dot_plot_female)

save

ggsave("../images_to_export/GCSKO_sexbranch_dot_male.png", plot = dot_plot_male, device = "png", path = NULL, scale = 1, width = 30, height = 60, units = "cm", dpi = 300, limitsize = TRUE)

ggsave("../images_to_export/GCSKO_sexbranch_dot_female.png", plot = dot_plot_female, device = "png", path = NULL, scale = 1, width = 30, height = 60, units = "cm", dpi = 300, limitsize = TRUE)

Pheatmap version of heatmap old cold to make main heatmap (NOT RUN)

Make annotations to add to the heatmap

## change names for row names to include "module " at the begining of them
row.names(agg_mat) <- stringr::str_c("Module ", row.names(agg_mat))

## add number of cells to the rownames for the module
for(i in seq_along(genes_per_module$Freq)){
  row.names(agg_mat)[i] <- stringr::str_c(row.names(agg_mat)[i]," (n = " ,genes_per_module$Freq[i], ")")
}

## create annotation of clusters for pheatmap:
cluster_anno <- data.frame(cluster = unique(colData(monocle.object)$seurat_clusters))
row.names(cluster_anno) <- cluster_anno$cluster

## clusters were defined earlier as:
male_clusters <- c("13", "5", "11", "25", "1", "17", "10", "24", "14", "27", "19")
female_clusters <- c("16", "22", "23", "15", "21", "30", "4", "3", "18", "7", "8", "6", "20", "12", "26")
asex_clusters <- c("0", "9", "28", "2", "29")

## add identities to the column
cluster_anno$group <- NA
cluster_anno$group[which(cluster_anno$cluster %in% asex_clusters)] <- "Asexual"
cluster_anno$group[which(cluster_anno$cluster %in% male_clusters)] <- "Male"
cluster_anno$group[which(cluster_anno$cluster %in% female_clusters)] <- "Female"
cluster_anno <- cluster_anno[ , 2, drop = FALSE]
cluster_anno

## add median pseudotime per cluster
## help here:
## https://stackoverflow.com/questions/54360855/calculate-mean-for-column-grouped-by-values-of-two-other-columns
## make subsetted dataframe
df_median_pt <- meta_data_df[ ,c("pt", "seurat_clusters")]
## apply across dataframe to get median
mean.df1 <- tapply(df_median_pt$pt, list(df_median_pt$seurat_clusters), median)
mean.df2 <- as.data.frame(as.table(mean.df1))
names(mean.df2) <- c("seurat_clusters", "pt_Median")
rownames(mean.df2) <- mean.df2$seurat_clusters
## to make each value have the mean in the OG dataframe
#merge(df_median_pt, mean.df2)
## add to annotation dataframe
cluster_anno <- merge(cluster_anno, mean.df2, by=0)

## add rownames to dataframe
rownames(cluster_anno) <- cluster_anno$Row.names
## subset to have only info of interest
cluster_anno <- cluster_anno[,c(2,4)]
names(cluster_anno) <- c("Identity", "Median_Pseudotime_of_Cluster")

WT cells by modules over pt (central panel)

## make annotation colours
annotation_colours <- list(Identity = c(Male="#016c00", Female="#a52b1e", Asexual= "#0052c5"),
                           Median_Pseudotime_of_Cluster = magma(12, direction = 1))

## reorder the levels
## make df of data
agg_mat_df <- as.data.frame(agg_mat)
## remove levels in my_levels that are not present here - i.e. clusters that are missing because they are not represented in the 10X data
my_levels_10x_data <- my_levels_sex[which(my_levels_sex %in% colnames(agg_mat_df))]
## sort the values
agg_mat_df <- agg_mat_df[ ,(match(my_levels_10x_data, colnames(agg_mat_df)))]

## order 
#cluster_anno <- cluster_anno[(match(my_levels_10x_data, rownames(cluster_anno))), ]

## reorder columns 
## first, order the annotation
cluster_anno <- cluster_anno[with(cluster_anno, order(Identity, Median_Pseudotime_of_Cluster)),]

## remove the NAs from this
cluster_anno <- cluster_anno[complete.cases(cluster_anno),]

agg_mat_df <- agg_mat_df[ ,match(rownames(cluster_anno), colnames(agg_mat_df))]

## plot heatmap
pheatmap::pheatmap(agg_mat_df, 
                   scale="row",
                   cluster_cols = FALSE,
                   clustering_method="ward.D2", 
                   annotation_col = cluster_anno, 
                   annotation_colors = annotation_colours, 
                   cutree_rows = 12)

#, gaps_col = c(28,29,37)
#row.names(agg_mat) <- factor(row.names(agg_mat), levels = row.names(agg_mat)[module_dendro$order])

## plot heatmap
#pheatmap::pheatmap(agg_mat_df, 
  #                  scale="column",
  #                  cluster_cols = TRUE,
  #                  cluster_rows = module_dendro,
  #                  #clustering_method="ward.D2",
  #                  cutree_rows = 5,
  #                  annotation_col = cluster_anno, 
  #                  annotation_colors = annotation_colours) + 
  # theme(legend.position = "bottom")
LS0tCnN1YnRpdGxlOiAnR2FtZXRvY3l0ZSBEZXZlbG9wbWVudCBpbiA8aT5QbGFzbW9kaXVtIGJlcmdoZWk8L2k+Jwp0aXRsZTogfAogICFbXSguLi9HQ1NLT19sb2dvLmpwZyl7d2lkdGg9MzAwcHh9ICAKICBQc2V1ZG90aW1lIFNleHVhbCBCcmFuY2gKYXV0aG9yOiAiW0FuZHJldyBSdXNzZWxsXShodHRwczovL2FqY3J1c3NlbGwud2l4c2l0ZS5jb20vbXlzaXRlL2Fib3V0KSIKaW5zdGl0dXRlOiBXZWxsY29tZSBTYW5nZXIgSW5zdGl0dXRlCmRhdGU6ICdgciBmb3JtYXQoU3lzLkRhdGUoKSwgIiVCICVkLCAlWSIpYCcKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0aGVtZTogY29zbW8KICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDMKICAgICN0b2NfZmxvYXQ6IHllcwogICAgZGZfcHJpbnQ6IHBhZ2VkCi0tLQoqKioKIyAxLiBJbnRyb2R1Y3Rpb24gYW5kIEFpbXMgey50YWJzZXR9CgpXZSBoYXZlIG1lcmdlZCB0aGUgdHdvIGRhdGFzZXRzIHRvZ2V0aGVyIGluIEdDU0tPX21lcmdlLlJtZC4gV2UgYWxzbyBzdWJzZXR0ZWQgb3V0IHRoZSBwcmUtc2V4dWFsLWJyYW5jaCBhbmQgdGhlIHNleHVhbCBjZWxscyAobWFsZSBhbmQgZmVtYWxlKSBhbmQgc3RvcmVkIHRoZW0gaW4gYSBTZXVyYXQgb2JqZWN0IGNhbGxlZCB0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleC4gSGVyZSwgd2Ugd2lsbCBwZXJmb3JtIHBzZXVkb3RpbWUgYW5hbHlzaXMgb24gdGhlIGRhdGFzZXQgYW5kIGJ1aWxkIG1vZHVsZXMgb2YgZ2VuZXMgdGhhdCBzaG93IHNpbWlsYXIgZXhwcmVzc2lvbiBhY3Jvc3MgdGhpcyBwc2V1ZG90aW1lLgoKIyAyLiBSZWFkIGluIHRoZSBkYXRhICB7LnRhYnNldH0KCiMjIExvYWQvSW5zdGFsbCB0aGUgUmVxdWlyZWQgUGFja2FnZXMKCmBgYHtyIGxvYWQgcGFja2FnZXMsIGVjaG8gPSBGQUxTRX0KIyMgQ1JBTiBwYWNrYWdlcwoKIyMgUGF0Y2h3b3JrIGlzIG5lZWRlZCB0byBzdGljaCBwbG90cyB0b2dldGhlciB1c2luZyAnKycKaWYocmVxdWlyZSgicGF0Y2h3b3JrIiwgcXVpZXRseSA9IFRSVUUpKXsKICAgIHByaW50KCJwYXRjaHdvcmsgaXMgbG9hZGVkIGNvcnJlY3RseSIpCn0gZWxzZSB7CiAgICBwcmludCgidHJ5aW5nIHRvIGluc3RhbGwgcGF0Y2h3b3JrIikKICAgIGluc3RhbGwucGFja2FnZXMoInBhdGNod29yayIpCiAgICBpZihyZXF1aXJlKHBhdGNod29yaykpewogICAgICAgIHByaW50KCJwYXRjaHdvcmsgaW5zdGFsbGVkIGFuZCBsb2FkZWQiKQogICAgfSBlbHNlIHsKICAgICAgICBzdG9wKCJjb3VsZCBub3QgaW5zdGFsbCBwYXRjaHdvcmsiKQogICAgfQp9CgojIyB2aXJpZGlzIGFsbG93cyBkaWZmZXJlbnQgY29sb3VycyB0byBiZSBhZGRlZCB0byBwbG90cwppZihyZXF1aXJlKCJ2aXJpZGlzIiwgcXVpZXRseSA9IFRSVUUpKXsKICAgIHByaW50KCJ2aXJpZGlzIGlzIGxvYWRlZCBjb3JyZWN0bHkiKQp9IGVsc2UgewogICAgcHJpbnQoInRyeWluZyB0byBpbnN0YWxsIHZpcmlkaXMiKQogICAgaW5zdGFsbC5wYWNrYWdlcygidmlyaWRpcyIpCiAgICBpZihyZXF1aXJlKHZpcmlkaXMpKXsKICAgICAgICBwcmludCgidmlyaWRpcyBpbnN0YWxsZWQgYW5kIGxvYWRlZCIpCiAgICB9IGVsc2UgewogICAgICAgIHN0b3AoImNvdWxkIG5vdCBpbnN0YWxsIHZpcmlkaXMiKQogICAgfQp9CgojIyBTZXVyYXQgaXMgbmVlZGVkIGZvciBtb3N0IG9mIHRoaXMgc2NyaXB0CmlmKHJlcXVpcmUoIlNldXJhdCIsIHF1aWV0bHkgPSBUUlVFKSl7CiAgICBwcmludCgiU2V1cmF0IGlzIGxvYWRlZCBjb3JyZWN0bHkiKQp9IGVsc2UgewogICAgcHJpbnQoInRyeWluZyB0byBpbnN0YWxsIFNldXJhdCIpCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJTZXVyYXQiKQogICAgaWYocmVxdWlyZShTZXVyYXQpKXsKICAgICAgICBwcmludCgiU2V1cmF0IGluc3RhbGxlZCBhbmQgbG9hZGVkIikKICAgIH0gZWxzZSB7CiAgICAgICAgc3RvcCgiY291bGQgbm90IGluc3RhbGwgU2V1cmF0IikKICAgIH0KfQoKIyMgY293cGxvdCBpcyBuZWVkZWQgZm9yIHBsb3RzIGluIHRoaXMgc2NyaXB0CmlmKHJlcXVpcmUoImNvd3Bsb3QiKSl7CiAgICBwcmludCgiY293cGxvdCBpcyBsb2FkZWQgY29ycmVjdGx5IikKfSBlbHNlIHsKICAgIHByaW50KCJ0cnlpbmcgdG8gaW5zdGFsbCBjb3dwbG90IikKICAgIGluc3RhbGwucGFja2FnZXMoImNvd3Bsb3QiKQogICAgaWYocmVxdWlyZShjb3dwbG90KSl7CiAgICAgICAgcHJpbnQoImNvd3Bsb3QgaW5zdGFsbGVkIGFuZCBsb2FkZWQiKQogICAgfSBlbHNlIHsKICAgICAgICBzdG9wKCJjb3VsZCBub3QgaW5zdGFsbCBjb3dwbG90IikKICAgIH0KfQoKIyMgZ3JpZEV4dHJhIGlzIG5lZWRlZCBmb3IgZ3JpZCBncmFwaGljcyB0byBwbG90IG11bHRpcGxlIHBsb3RzIGluIHRoZSBzYW1lIHZpZXcKaWYocmVxdWlyZSgiZ3JpZEV4dHJhIikpewogICAgcHJpbnQoImdyaWRFeHRyYSBpcyBsb2FkZWQgY29ycmVjdGx5IikKfSBlbHNlIHsKICAgIHByaW50KCJ0cnlpbmcgdG8gaW5zdGFsbCBncmlkRXh0cmEiKQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ3JpZEV4dHJhIikKICAgIGlmKHJlcXVpcmUoZ3JpZEV4dHJhKSl7CiAgICAgICAgcHJpbnQoImdyaWRFeHRyYSBpbnN0YWxsZWQgYW5kIGxvYWRlZCIpCiAgICB9IGVsc2UgewogICAgICAgIHN0b3AoImNvdWxkIG5vdCBpbnN0YWxsIGdyaWRFeHRyYSIpCiAgICB9Cn0KCiMjIGdyaWQgaXMgbmVlZGVkIGZvciBncmlkLmFycmFuZ2UgZnVuY3Rpb24gdG8gY2hhbmdlIHNpemUgb2YgdGl0bGUKaWYocmVxdWlyZSgiZ3JpZCIpKXsKICAgIHByaW50KCJncmlkIGlzIGxvYWRlZCBjb3JyZWN0bHkiKQp9IGVsc2UgewogICAgcHJpbnQoInRyeWluZyB0byBpbnN0YWxsIGdyaWQiKQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ3JpZCIpCiAgICBpZihyZXF1aXJlKGdyaWQpKXsKICAgICAgICBwcmludCgiZ3JpZCBpbnN0YWxsZWQgYW5kIGxvYWRlZCIpCiAgICB9IGVsc2UgewogICAgICAgIHN0b3AoImNvdWxkIG5vdCBpbnN0YWxsIGdyaWQiKQogICAgfQp9CgojI2ZvciBkb2luZyBidWxrIGNvcnJlbGF0aW9uIGNhbGN1bGF0aW9ucwppZihyZXF1aXJlKCJIbWlzYyIpKXsKICAgIHByaW50KCJIbWlzYyBpcyBsb2FkZWQgY29ycmVjdGx5IikKfSBlbHNlIHsKICAgIHByaW50KCJ0cnlpbmcgdG8gaW5zdGFsbCBIbWlzYyIpCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJIbWlzYyIpCiAgICBpZihyZXF1aXJlKEhtaXNjKSl7CiAgICAgICAgcHJpbnQoIkhtaXNjIGluc3RhbGxlZCBhbmQgbG9hZGVkIikKICAgIH0gZWxzZSB7CiAgICAgICAgc3RvcCgiY291bGQgbm90IGluc3RhbGwgSG1pc2MiKQogICAgfQp9CgojIyByZXNoYXBlMiB0byBtZWx0IGRhdGFmcmFtZXMgZm9yIHBsb3R0aW5nOgppZihyZXF1aXJlKCJyZXNoYXBlMiIpKXsKICAgIHByaW50KCJyZXNoYXBlMiBpcyBsb2FkZWQgY29ycmVjdGx5IikKfSBlbHNlIHsKICAgIHByaW50KCJ0cnlpbmcgdG8gaW5zdGFsbCByZXNoYXBlMiIpCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJyZXNoYXBlMiIpCiAgICBpZihyZXF1aXJlKHJlc2hhcGUyKSl7CiAgICAgICAgcHJpbnQoInJlc2hhcGUyIGluc3RhbGxlZCBhbmQgbG9hZGVkIikKICAgIH0gZWxzZSB7CiAgICAgICAgc3RvcCgiY291bGQgbm90IGluc3RhbGwgcmVzaGFwZTIiKQogICAgfQp9CgojIyB0byB3b3JrIHdpdGggZGF0YSBmcmFtZXM6CmlmKHJlcXVpcmUoImRwbHlyIikpewogICAgcHJpbnQoImRwbHlyIGlzIGxvYWRlZCBjb3JyZWN0bHkiKQp9IGVsc2UgewogICAgcHJpbnQoInRyeWluZyB0byBpbnN0YWxsIGRwbHlyIikKICAgIGluc3RhbGwucGFja2FnZXMoImRwbHlyIikKICAgIGlmKHJlcXVpcmUoZHBseXIpKXsKICAgICAgICBwcmludCgiZHBseXIgaW5zdGFsbGVkIGFuZCBsb2FkZWQiKQogICAgfSBlbHNlIHsKICAgICAgICBzdG9wKCJjb3VsZCBub3QgaW5zdGFsbCBkcGx5ciIpCiAgICB9Cn0KCiMjIHRoaXMgYWxsb3dzIHVzIHRvIHVzZSB0aGUgY29sb3JSYW1wMiBmdW5jdGlvbiB3aGljaCBhbGxvd3MgdXMgdG8gcGxvdCBuaWNlIGNvbG91ciBncmFkaWVudCBwYWxzOgppZihyZXF1aXJlKCJjaXJjbGl6ZSIpKXsKICAgIHByaW50KCJjaXJjbGl6ZSBpcyBsb2FkZWQgY29ycmVjdGx5IikKfSBlbHNlIHsKICAgIHByaW50KCJ0cnlpbmcgdG8gaW5zdGFsbCBjaXJjbGl6ZSIpCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJjaXJjbGl6ZSIpCiAgICBpZihyZXF1aXJlKGNpcmNsaXplKSl7CiAgICAgICAgcHJpbnQoImNpcmNsaXplIGluc3RhbGxlZCBhbmQgbG9hZGVkIikKICAgIH0gZWxzZSB7CiAgICAgICAgc3RvcCgiY291bGQgbm90IGluc3RhbGwgY2lyY2xpemUiKQogICAgfQp9CgojIyBub24tQ1JBTiBwYWNrYWdlcwoKIyMgbW9ub2NsZTMgdG8gY2FsY3VsYXRlIHBzZXVkb3RpbWU6CmlmKHJlcXVpcmUoIm1vbm9jbGUzIikpewogICAgcHJpbnQoIm1vbm9jbGUzIGlzIGxvYWRlZCBjb3JyZWN0bHkiKQp9IGVsc2UgewogICAgcHJpbnQoIlBsZWFzZSBpbnN0YWxsIG1vbm9jbGUzIChodHRwczovL2NvbGUtdHJhcG5lbGwtbGFiLmdpdGh1Yi5pby9tb25vY2xlMy9kb2NzL2luc3RhbGxhdGlvbi8pIikKfQoKIyMgZGVzdGlueSBpcyB1c2VkIGZvciBkaWZmdXNpb24gcGxvdHMgKERpZmZ1c2lvbk1hcCBmdW5jdGlvbikKaWYocmVxdWlyZSgiZGVzdGlueSIpKXsKICAgIHByaW50KCJkZXN0aW55IGlzIGxvYWRlZCBjb3JyZWN0bHkiKQp9IGVsc2UgewogIHByaW50KCJ0cnlpbmcgdG8gaW5zdGFsbCBkZXN0aW55IikKICBpZiAoIXJlcXVpcmVOYW1lc3BhY2UoIkJpb2NNYW5hZ2VyIiwgcXVpZXRseSA9IFRSVUUpKQogICAgaW5zdGFsbC5wYWNrYWdlcygiQmlvY01hbmFnZXIiKQogIEJpb2NNYW5hZ2VyOjppbnN0YWxsKCJkZXN0aW55IikKICBpZihyZXF1aXJlKGRlc3RpbnkpKXsKICAgICAgICBwcmludCgiZGVzdGlueSBpbnN0YWxsZWQgYW5kIGxvYWRlZCIpCiAgICB9IGVsc2UgewogICAgICAgIHN0b3AoImNvdWxkIG5vdCBpbnN0YWxsIGRlc3RpbnkiKQogICAgfQp9Cgojc2V0IHRoZSBzZWVkIGZvciBib3RoIHRoZSBtaXh0dXJlIG1vZGVscyBhbmQgYWxzbyBmb3IgdGhlIHNhbXBsZSBmdW5jdGlvbiBsYXRlciBvbjoKc2V0LnNlZWQoLTkyNDk3KQpgYGAKCiMjIGxvYWQgZGF0YQoKYGBge3J9CiMjIGxvYWQgc2V4IG9ubHkgYnJhbmNoIGNlbGxzIHNhdmVkIGZyb20gR0NTS09fU2V4X0JyYW5jaF9BbmFseXNpcy5SbWQKIyMgUmVzdG9yZSB0aGUgb2JqZWN0cwojIyBsb2FkIHNleCBicmFuY2ggZGF0YXNldAp0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleCA8LSByZWFkUkRTKCIuLi9kYXRhX3RvX2V4cG9ydC90ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleC5SRFMiKQojIyBsb2FkIGZ1bGwgZGF0YXNldAojdGVueC5tdXRhbnQuaW50ZWdyYXRlZCA8LSByZWFkUkRTKCIuLi9kYXRhX3RvX2V4cG9ydC90ZW54Lm11dGFudC5pbnRlZ3JhdGVkLlJEUyIpCmBgYAoKYGBge3J9CiMjIGNyZWF0ZSBhIGxpc3Qgb2Ygb3VyIG11dGFudCBnZW5lIElEcwpsaXN0X29mX211dGFudF9nZW5lcyA8LSBjKCJQQkFOS0EtMDgyODAwMCIsICJQQkFOS0EtMTMwMjcwMCIsICJQQkFOS0EtMTQ0NzkwMCIsICJQQkFOS0EtMDEwMjQwMCIsICJQQkFOS0EtMDcxNjUwMCIsICJQQkFOS0EtMTQzNTIwMCIsICJQQkFOS0EtMTQxODEwMCIsICJQQkFOS0EtMTE0NDgwMCIsICJQQkFOS0EtMDkwMjMwMCIsICJQQkFOS0EtMDQxMzQwMCIsICJQQkFOS0EtMTQ1NDgwMCIpCmBgYAoKUmVhZCBpbiBnZW5lIGFubm90YXRpb25zCmBgYHtyfQpnZW5lX2Fubm90YXRpb25zIDwtIHJlYWQudGFibGUoIi4uL2RhdGEvUmVmZXJlbmNlL0dlbmVzQnlUYXhvbl9TdW1tYXJ5LmNzdiIsIGhlYWRlciA9IFRSVUUsIHNlcCA9ICIsIiwgc3RyaW5nc0FzRmFjdG9ycyA9IFRSVUUpCmRpbShnZW5lX2Fubm90YXRpb25zKQoKIyMgY29udmVydCBfIHRvIC0KZ2VuZV9hbm5vdGF0aW9ucyRHZW5lLklEIDwtIGdzdWIoIl8iLCAiLSIsIGdlbmVfYW5ub3RhdGlvbnMkR2VuZS5JRCkKYGBgCgojIDMuIERpbWVuc2lvbmFsdHkgUmVkdWN0aW9uIHsudGFic2V0fQoKV2Ugd2lsbCBub3cgcmUtY2FsY3VsYXRlIHRoZSBVTUFQLCBQQ0EgYW5kIGRpZmZ1c2lvbiBtYXAgdG8gdmlzdWFsaXNlIHRoZSBkYXRhIHNpbmNlIHRoZSBvbGQgdmlzdWFsaXNhdGlvbiB1c2VkIHRoZSB2YXJpYXRpb24gaW4gdGhlIHdob2xlIGRhdGFzZXQgYW5kIHNvIHNvbWUgb2YgdGhlIHZhcmlhdGlvbiBpbiB0aGlzIHNldCBvZiBjZWxscyB3YXMgb2JzY3VyZWQuCgpyZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9zYXRpamFsYWIvc2V1cmF0L2lzc3Vlcy8xODgzCgojIyBBLiBSZWNhbGN1bGF0ZSBQQ0EKClRoZSBQQ0EgaXMgdXNlZCBhcyB0aGUgYmFzaXMgb2Ygb3RoZXIgZGltZW5zaW9uYWxpdHkgcmVkdWN0aW9ucyBzbyB3ZSB3aWxsIG5vdyByZWNhbGN1bGF0ZSB0aGlzIHRvIGdldCB0byBvdXIgZmluYWwgVU1BUC4KCkZpcnN0LCBydW4gUENBIGFnYWluCmBgYHtyfQp0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleCA8LSBSdW5QQ0EodGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXgsIG5wY3MgPSAzMCwgdmVyYm9zZSA9IEZBTFNFKQpgYGAKClRoZW4gaW5zcGVjdCB0aGUgUENzCmBgYHtyfQpFbGJvd1Bsb3QodGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXgsIG5kaW1zID0gMzAsIHJlZHVjdGlvbiA9ICJwY2EiKQpgYGAKCkhhdmUgYSBxdWljayBsb29rIGF0IHRoZSBvdXRwdXQKYGBge3J9CkRpbVBsb3QodGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXgsIHJlZHVjdGlvbiA9ICJwY2EiLCBwdC5zaXplID0gMC4wMSwgbGFiZWwgPSBUUlVFKQpgYGAKCkFuZCBkZXRlcm1pbmUgd2hhdCBpcyBtYWxlIGFuZCBmZW1hbGU6CmBgYHtyfQpGZWF0dXJlUGxvdCh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleCwgZmVhdHVyZXMgPSBjKCJQQkFOS0EtMTMxOTUwMCIsICJQQkFOS0EtMDQxNjEwMCIpLCBibGVuZCA9IFRSVUUsIGNvbWJpbmUgPSBUUlVFLCBjb29yZC5maXhlZCA9IFRSVUUsIHJlZHVjdGlvbiA9ICJwY2EiKQpgYGAKCgpgYGB7cn0KIyMgZXh0cmFjdCB0aGUgY2VsbCBlbWJlZGRpbmdzIGZyb20gdGhlIHBjYQptZHMgPC0gYXMuZGF0YS5mcmFtZSh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEByZWR1Y3Rpb25zJHBjYUBjZWxsLmVtYmVkZGluZ3MpCgojIyBjaGFuZ2UgdGhlIGNvb3JkaW5hdGVzIG9mIFVNQVAgMSBzbyB0aGV5IGFyZSByZXZlcnNlZAojIyB0YWtlIG9ubHkgdGhlIGZpcnN0IHR3byBQQ3MKbWRzIDwtIG1kc1sgLGMoIlBDXzEiLCAiUENfMiIpXQptZHMkUENfMSA8LSAtbWRzJFBDXzEKbWRzJFBDXzIgPC0gLW1kcyRQQ18yCgojIyBjaGFuZ2UgbmFtZXMgb2YgdGhlIGNvbHMgCmNvbG5hbWVzKG1kcykgPC0gcGFzdGUwKCJESU1fUENfIiwgMToyKQoKIyMgbWFrZSBpbnRvIGEgbWF0cml4IHNvIHRoYXQgaXQgY2FuIGJlIHNhdmVkIGluIFNldXJhdAptZHMgPC0gYXMubWF0cml4KG1kcykKCiMjIHN0b3JlIHRoaXMgb3B0aW1zZWQgVU1BUCBpbiBhIGN1c3RvbSBkaW0gc2xvdAp0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleFtbIkRJTV9QQ0EiXV0gPC0gQ3JlYXRlRGltUmVkdWNPYmplY3QoZW1iZWRkaW5ncyA9IG1kcywga2V5ID0gIkRJTV9QQ0FfIiwgYXNzYXkgPSBEZWZhdWx0QXNzYXkodGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXgpKQoKIyMgY2hlY2sKRGltUGxvdCh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleCwgbGFiZWwgPSBUUlVFLCByZXBlbCA9IEZBTFNFLCBwdC5zaXplID0gMC4wNSwgZGltcyA9IGMoMSwyKSwgcmVkdWN0aW9uID0gIkRJTV9QQ0EiKSArIGNvb3JkX2ZpeGVkKCkKYGBgCkNhbGN1bGF0ZSBuZXcgY2x1c3RlcnMgCmBgYHtyLCBmaWcuaGVpZ2h0ID0gMywgZmlnLndpZHRoID0gNX0KIyMgZ2VuZXJhdGUgbmV3IGNsdXN0ZXJzIGF0IG1pZCByZXNvbHV0aW9uCiMjIDIKdGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXggPC0gRmluZE5laWdoYm9ycyh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleCwgZGltcyA9IDE6MTEsIHJlZHVjdGlvbiA9ICJwY2EiKQp0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleCA8LSBGaW5kQ2x1c3RlcnModGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXgsIHJlc29sdXRpb24gPSAxLCByYW5kb20uc2VlZCA9IDQyLCBhbGdvcml0aG0gPSAyKQoKIyMgUGxvdApwY2FfcGxvdCA8LSBEaW1QbG90KHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4LCBsYWJlbCA9IFRSVUUsIHJlcGVsID0gVFJVRSwgcHQuc2l6ZSA9IDAuNSwgZGltcyA9IGMoMSwyKSwgcmVkdWN0aW9uID0gIkRJTV9QQ0EiLCBncm91cC5ieSA9ICJzZXVyYXRfY2x1c3RlcnMiKSArIGNvb3JkX2ZpeGVkKCkgCiMjIHZpZXcKSG92ZXJMb2NhdG9yKHBsb3QgPSBwY2FfcGxvdCwgaW5mb3JtYXRpb24gPSBGZXRjaERhdGEodGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXgsIHZhcnMgPSBjKCJpZGVudGl0eV9jb21iaW5lZCIsICJzZXVyYXRfY2x1c3RlcnMiKSkpCmBgYAoKYGBge3J9CnVtYXBfY2x1c3RlcnMgPC0gRGltUGxvdCh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleCwgbGFiZWwgPSBUUlVFLCByZXBlbCA9IFRSVUUsIHB0LnNpemUgPSAwLjUsIGRpbXMgPSBjKDEsMiksIHJlZHVjdGlvbiA9ICJESU1fUENBIikrCiAgY29vcmRfZml4ZWQoKSArCiAgICAgIHRoZW1lX3ZvaWQoKSArIApzY2FsZV9jb2xvcl9kaXNjcmV0ZV9xdWFsaXRhdGl2ZShwYWxldHRlID0gIkRhcmsgMyIpCgp1bWFwX2NsdXN0ZXJzCmBgYApzYXZlCmBgYHtyfQpnZ3NhdmUoIi4uL2ltYWdlc190b19leHBvcnQvQUxMQ0VMTFNfY2x1c3Rlcl9zZXhfYnJhbmNoX2xvY2F0aW9ucy5wbmciLCBwbG90ID0gdW1hcF9jbHVzdGVycywgZGV2aWNlID0gInBuZyIsIHBhdGggPSBOVUxMLCBzY2FsZSA9IDEsIHdpZHRoID0gMTAsIGhlaWdodCA9IDEyLCB1bml0cyA9ICJjbSIsIGRwaSA9IDMwMCwgbGltaXRzaXplID0gVFJVRSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMTAsIGZpZy5sZW5ndGggPSAxMH0KIyMgbWFrZSBsaXN0IG9mIGdlbm90eXBlcwpsaXN0X29mX2dlbm90eXBlcyA8LSB1bmlxdWUodGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXhAbWV0YS5kYXRhJGlkZW50aXR5X2NvbWJpbmVkKQojIyByZWRvcmRlciBmb3IgYmV0dGVyIHBsb3R0aW5nCmxpc3Rfb2ZfZ2Vub3R5cGVzIDwtIGxpc3Rfb2ZfZ2Vub3R5cGVzW2MoMSwgMywgMiwgNCwgMTEsIDcsIDgsIDEyLCA1LCAxMCwgNiwgOSldCgojIyBtYWtlIGEgYmxhbmsgbGlzdApsaXN0X3Bsb3RzX3NleF9oaWdobGlnaHQgPC0gdmVjdG9yKG1vZGUgPSAibGlzdCIsIGxlbmd0aCA9IGxlbmd0aChsaXN0X29mX2dlbm90eXBlcykpCgojIyBmb3IgbG9vcApmb3IoaSBpbiBzZXFfYWxvbmcobGlzdF9vZl9nZW5vdHlwZXMpKXsKICAgICMjIG1ha2UgYSBsaXN0IG9mIGNlbGxzIHRvIGhpZ2hsaWdodCAtIGJ1dCBmb3Igd2lsZC10eXBlLCBpbmNsdWRlIGFsbCBjZWxscyBvZiB0aGF0IGdlbm90eXBlLCBub3QganVzdCBvbmVzIGV4Y2x1ZGVkIGZvciBzZXggcmF0aW8KICBpZiAoZ3JlcGwoIndpbGQtdHlwZSIsIGxpc3Rfb2ZfZ2Vub3R5cGVzW2ldKSA9PSBGQUxTRSkgewogIGxpc3Rfb2ZfY2VsbHMgPC0gcm93bmFtZXModGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXhAbWV0YS5kYXRhW3doaWNoKHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YSRpZGVudGl0eV9jb21iaW5lZCA9PSBsaXN0X29mX2dlbm90eXBlc1tpXSAmIHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YSRleGNsdWRlX2Zvcl9zZXhfcmF0aW8gPT0gRkFMU0UpLCBdKSB9IGVsc2UKICB7bGlzdF9vZl9jZWxscyA8LSByb3duYW1lcyh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGFbd2hpY2godGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXhAbWV0YS5kYXRhJGlkZW50aXR5X2NvbWJpbmVkID09IGxpc3Rfb2ZfZ2Vub3R5cGVzW2ldKSwgXSl9CiAgIyMgbWFrZSBhIHBsb3QKICBwY2FfcGxvdCA8LSBEaW1QbG90KHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4LCBsYWJlbCA9IEZBTFNFLCByZXBlbCA9IFRSVUUsIHB0LnNpemUgPSAwLjEsIGNlbGxzLmhpZ2hsaWdodCA9IGxpc3Rfb2ZfY2VsbHMsIGRpbXMgPSBjKDEsMiksIHJlZHVjdGlvbiA9ICJESU1fUENBIikgKyAKICBjb29yZF9maXhlZCgpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjRTJFMkUyIiwgIiMzMTIwNkUiKSkgKyAKICB0aGVtZV92b2lkKCkgKyAKICBsYWJzKHRpdGxlID0gcGFzdGUobGlzdF9vZl9nZW5vdHlwZXNbaV0pKSArIAogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhbWlseT0iQXJpYWwiLCBzaXplID0gMTUsIGZhY2UgPSAiYm9sZC5pdGFsaWMiKSwgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQogICMjIGFkZCB0byB0aGUgbGlzdAogIGxpc3RfcGxvdHNfc2V4X2hpZ2hsaWdodFtbaV1dIDwtIHBjYV9wbG90Cn0KYGBgCnBsb3QKYGBge3IsIGZpZy5oZWlnaHQgPSAxMCwgZmlnLndpZHRoID0gMTB9CiMjIHRoaXMgZnVuY3Rpb24gd3JpdGVzIHRoZSBuZXh0IGJpdCBvZiBjb2RlIGZvciB5b3UKIyMgcHV0IGl0IGludG8gdGhlIGNvbnNvbGUgYW5kIHBhc3RlIHRoZSByZXNwb25zZQojcGxvdHkgPC0gYygpCiNmb3IoaSBpbiBzZXFfYWxvbmcobGlzdF9vZl9nZW5vdHlwZXMpKXsKIyAgcGxvdHkgPC0gcGFzdGUwKHBsb3R5LCAibGlzdF9wbG90c19zZXhfaGlnaGxpZ2h0W1siLCBpLCAiXV0iLCAiICsgIikKI30KCiMjIHBsb3QKY29tcG9zaXRlX2NlbGxfbG9jYXRpb25zIDwtIHBsb3RfZ3JpZChsaXN0X3Bsb3RzX3NleF9oaWdobGlnaHRbWzFdXSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhbWlseT0iQXJpYWwiLCBzaXplID0gMTMsIGZhY2UgPSAiYm9sZCIpLCBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X3Bsb3RzX3NleF9oaWdobGlnaHRbWzJdXSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhbWlseT0iQXJpYWwiLCBzaXplID0gMTMsIGZhY2UgPSAiYm9sZCIpLCBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X3Bsb3RzX3NleF9oaWdobGlnaHRbWzNdXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9wbG90c19zZXhfaGlnaGxpZ2h0W1s0XV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfcGxvdHNfc2V4X2hpZ2hsaWdodFtbNV1dLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X3Bsb3RzX3NleF9oaWdobGlnaHRbWzZdXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9wbG90c19zZXhfaGlnaGxpZ2h0W1s3XV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfcGxvdHNfc2V4X2hpZ2hsaWdodFtbOF1dLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X3Bsb3RzX3NleF9oaWdobGlnaHRbWzldXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9wbG90c19zZXhfaGlnaGxpZ2h0W1sxMF1dLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X3Bsb3RzX3NleF9oaWdobGlnaHRbWzExXV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfcGxvdHNfc2V4X2hpZ2hsaWdodFtbMTJdXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJvdyA9IDIpCgpjb21wb3NpdGVfY2VsbF9sb2NhdGlvbnMKYGBgCgpzYXZlCmBgYHtyfQpnZ3NhdmUoIi4uL2ltYWdlc190b19leHBvcnQvQUxMQ0VMTFNfbXV0YW50X2NlbGxfbG9jYXRpb25zLnBuZyIsIHBsb3QgPSBjb21wb3NpdGVfY2VsbF9sb2NhdGlvbnMsIGRldmljZSA9ICJwbmciLCBwYXRoID0gTlVMTCwgc2NhbGUgPSAxLCB3aWR0aCA9IDMwLCBoZWlnaHQgPSAyMCwgdW5pdHMgPSAiY20iLCBkcGkgPSAzMDAsIGxpbWl0c2l6ZSA9IFRSVUUpCmBgYAoKIyMgUHNldWRvdGltZQoKYGBge3J9CiMjIG1ha2UgYSBuZXcgU2V1cmF0IG9mIHRoaXMKc2V1cmF0Lm9iamVjdC5zZXggPC0gdGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXgKCiMjIGV4dHJhY3QgY291bnRzIGFuZCBwaGVubzoKIyMgdGhlIHJlYXNvbiB3ZSB1c2UgdGhlIGludGVncmF0ZWQgYW5kIHRoZW4gc3Vic2V0dGVkIGlzIGJlY2F1c2UgdGhlc2UgY2VsbHMgaGF2ZSBiZWVuIG5vcm1hbGlzZWQgd2hlcmVhcyB0aGUgY2VsbHMgaW4gcGJfc2V4X2ZpbHRlcmVkIGhhdmUgbm90IGJlZW4gbm9ybWFsaXNlZCAod2VsbCB0aGV5IGhhdmUgYnV0IHdpdGggZG91YmxldHMgaW4gdGhlbSkKIyMgd2l0aCAxMHggb25seSBjZWxsczogYWxsLmVxdWFsKGFzLmRhdGEuZnJhbWUoY291bnRzKG1vbm9jbGUub2JqZWN0KSksIGFzLmRhdGEuZnJhbWUoYXMubWF0cml4KEdldEFzc2F5RGF0YShzZXVyYXQub2JqZWN0LCBhc3NheSA9ICJSTkEiLCBzbG90ID0gImNvdW50cyIpKSkpIHJldHVybnMgVFJVRSBhbmQgYWxzbyByZXR1cm5zIHRydWUgd2hlbiB5b3UgY2hhbmdlIHRoZSBzbG90IGlucHV0IHRvICJjb3VudHMiIGFuZCB1c2UgbW9ub2NsZSB0byBub3JtIGl0IHdpdGggbWV0aG9kICJsb2ciCmRhdGEgPC0gYXMoYXMubWF0cml4KEdldEFzc2F5RGF0YShzZXVyYXQub2JqZWN0LnNleCwgYXNzYXkgPSAiUk5BIiwgc2xvdCA9ICJjb3VudHMiKSksICdzcGFyc2VNYXRyaXgnKQojIyBtYWtlIHBoZW5vZGF0YQpwZCA8LSBkYXRhLmZyYW1lKHNldXJhdC5vYmplY3Quc2V4QG1ldGEuZGF0YSkKIyMga2VlcCBvbmx5IHRoZSBjb2x1bW5zIHRoYXQgYXJlIHJlbGV2YW50IGluIG1ldGFkYXRhCiNwRGF0YSA8LSBwZCAlPiUgc2VsZWN0KG9yaWcuaWRlbnQsIG5Db3VudF9STkEsIG5GZWF0dXJlX1JOQSkKIyMgbWFrZSBnZW5lIG1ldGFkYXRhCmZEYXRhIDwtIGRhdGEuZnJhbWUoZ2VuZV9zaG9ydF9uYW1lID0gcm93Lm5hbWVzKGRhdGEpLCByb3cubmFtZXMgPSByb3cubmFtZXMoZGF0YSkpCgojIyBDb25zdHJ1Y3QgbW9ub2NsZSBjZHMKbW9ub2NsZS5vYmplY3Quc2V4IDwtIG5ld19jZWxsX2RhdGFfc2V0KGV4cHJlc3Npb25fZGF0YSA9IGRhdGEsIGNlbGxfbWV0YWRhdGEgPSBwZCwgZ2VuZV9tZXRhZGF0YSA9IGZEYXRhKQoKIyMgcHJlcHJvY2Vzcwptb25vY2xlLm9iamVjdC5zZXggPSBwcmVwcm9jZXNzX2Nkcyhtb25vY2xlLm9iamVjdC5zZXgsIG51bV9kaW0gPSA1MCwgbm9ybV9tZXRob2QgPSAibG9nIikKIyMjIGlmIHVzaW5nIGludGVncmF0ZWQgZGF0YToKIyBub3JtX21ldGhvZCA9ICJub25lIiwgYWxpZ25tZW50X2dyb3VwID0gIn4gZXhwZXJpbWVudCIKCiMjIHBsb3QgamFjayBzdHJhdyBwbG90CiNwbG90X3BjX3ZhcmlhbmNlX2V4cGxhaW5lZChtb25vY2xlLm9iamVjdCkKCiNtb25vY2xlLm9iamVjdCA9IHJlZHVjZV9kaW1lbnNpb24obW9ub2NsZS5vYmplY3QsIHJlZHVjdGlvbl9tZXRob2QgPSAiVU1BUCIsIHByZXByb2Nlc3NfbWV0aG9kID0gIlBDQSIsIHVtYXAubWV0cmljID0gImV1Y2xpZGVhbiIsIHVtYXAubl9uZWlnaGJvcnMgPSA1MCwgdW1hcC5taW5fZGlzdCA9IDAuNSwgdmVyYm9zZSA9IEZBTFNFKQoKI3Bsb3RfY2VsbHMobW9ub2NsZS5vYmplY3QsIGNvbG9yX2NlbGxzX2J5PSJleHBlcmltZW50IikKCiMjIGdyYXBoIGxlYXJuaW5nCgojIyBhZGQgVU1BUCBmcm9tIFNldXJhdAptb25vY2xlLm9iamVjdC5zZXhAaW50X2NvbERhdGFAbGlzdERhdGEkcmVkdWNlZERpbXNAbGlzdERhdGFbWyJVTUFQIl1dIDwtIHNldXJhdC5vYmplY3Quc2V4QHJlZHVjdGlvbnNbWyJESU1fUENBIl1dQGNlbGwuZW1iZWRkaW5ncwojIyBpZiB5b3Ugd2FudCB0aGUgb2xkIFVNQVAgZnJvbSB0aGUgb3JpZ2luYWwgYWxsIGNlbGxzIG9uZSwgdXNlOiAiRElNX1VNQVAiCgojIyBjbHVzdGVyCiMjIHRoaXMgaXMgZXNzZW50aWFsIHRvIHJ1biB0aGUgbGVhcm5fZ3JhcGggZnVuY3Rpb24gbGF0ZXIgb24KbW9ub2NsZS5vYmplY3Quc2V4ID0gY2x1c3Rlcl9jZWxscyhtb25vY2xlLm9iamVjdC5zZXgpCgojIyBwbG90IGluaXRpYWwgY2x1c3RlcmluZyBieSBtb25vY2xlCiNwbG90X2NlbGxzKG1vbm9jbGUub2JqZWN0LCBjb2xvcl9jZWxsc19ieT0iY2x1c3RlciIsIGdyb3VwX2NlbGxzX2J5PSJwYXJ0aXRpb24iLCB4ID0gMiwgeSA9IDEpCgojIyBtYXAgcHNldWRvdGltZQptb25vY2xlLm9iamVjdC5zZXggPSBsZWFybl9ncmFwaChtb25vY2xlLm9iamVjdC5zZXgsIGxlYXJuX2dyYXBoX2NvbnRyb2w9bGlzdChuY2VudGVyPTIwMCwgbWluaW1hbF9icmFuY2hfbGVuID0gMTApLCB1c2VfcGFydGl0aW9uID0gRkFMU0UpCiMgbGVhcm5fZ3JhcGhfY29udHJvbD1saXN0KG5jZW50ZXI9NTAwKSAtIHBsYXkgd2l0aCB0aGlzIHBhcmFtZXRlciAtIGxvd2VyIHRlbmRzIHRvIGdpdmUgZmV3ZXIgYnJhbmNoZXMgYW5kIGhpZ2hlciB0ZW5kcyB0byBnaXZlIG1vcmUKIyA1MDAgLSBvbGQgYW5hbHlzaXMKIyAyNTAgLSBuZXcgYW5hbHlzaXMgCgojIzIwMAoKIyMgUGxvdCBjZWxscwpwbG90X2NlbGxzKG1vbm9jbGUub2JqZWN0LnNleCwgY29sb3JfY2VsbHNfYnk9InBvc3RfaW50ZWdyYXRpb25fY2x1c3RlcnMiLCBncm91cF9jZWxsc19ieT0icGFydGl0aW9uIiwgeCA9IDEsIHkgPSAyKQpgYGAKClJlZGVmaW5lIHRoZSBpZGVudGl0aWVzIG9mIHRoZSBtYWxlIGFuZCBmZW1hbGUgY2VsbHMgCgptYWxlCmBgYHtyfQptb25vY2xlLm9iamVjdF9tYWxlIDwtIGNob29zZV9ncmFwaF9zZWdtZW50cyhtb25vY2xlLm9iamVjdC5zZXgpCmBgYApmZW1hbGUKYGBge3J9Cm1vbm9jbGUub2JqZWN0X2ZlbWFsZSA8LSBjaG9vc2VfZ3JhcGhfc2VnbWVudHMobW9ub2NsZS5vYmplY3Quc2V4KQpgYGAKYmlwb3RlbnRpYWwKYGBge3J9Cm1vbm9jbGUub2JqZWN0X2JpcG90IDwtIGNob29zZV9ncmFwaF9zZWdtZW50cyhtb25vY2xlLm9iamVjdC5zZXgpCmBgYAoKY2hlY2sKYGBge3J9CmRmX2ZyZXEgPC0gZGF0YS5mcmFtZSh0YWJsZShjKGNvbG5hbWVzKG1vbm9jbGUub2JqZWN0X21hbGUpLCBjb2xuYW1lcyhtb25vY2xlLm9iamVjdF9mZW1hbGUpLCBjb2xuYW1lcyhtb25vY2xlLm9iamVjdF9iaXBvdCkpKSkKcGFzdGUoIm51bWJlciBvZiBjZWxscyBpbiBzZXVyYXQgb2JqZWN0IGlzIiwgbGVuZ3RoKGNvbG5hbWVzKG1vbm9jbGUub2JqZWN0LnNleCkpLCAiLiBUaGUgbnVtYmVyIG9mIGNlbGxzIHNlbGVjdGVkIGhlcmUgd2l0aCBhbiBpZGVudGl0aXR5IGlzIiwgZGltKGRmX2ZyZXEpWzFdKQpkZl9mcmVxIDwtIGRmX2ZyZXFbZGZfZnJlcSRGcmVxID4gMSwgXQpkZl9mcmVxCmBgYApJbnNwZWN0IHdoZXJlIHRoZXNlIG1pc3NpbmcgY2VsbHMgYXJlOgpgYGB7cn0KIyAnJW5pJScgPC0gTmVnYXRlKCclaW4lJykKIyAKIyBub3RfYXNzaWduZWRfY2VsbHMgPC0gY29sbmFtZXMobW9ub2NsZS5vYmplY3QpW2NvbG5hbWVzKG1vbm9jbGUub2JqZWN0KSAlbmklIGMoY29sbmFtZXMobW9ub2NsZS5vYmplY3RfbWFsZSksIGNvbG5hbWVzKG1vbm9jbGUub2JqZWN0X2ZlbWFsZSksIGNvbG5hbWVzKG1vbm9jbGUub2JqZWN0X2JpcG90KSwgY29sbmFtZXMobW9ub2NsZS5vYmplY3RfYXNleCksIGNvbG5hbWVzKG1vbm9jbGUub2JqZWN0X2FzZXhfZmF0ZSkpXQojIAojIERpbVBsb3Qoc2V1cmF0Lm9iamVjdCwgcmVwZWwgPSBUUlVFLCBsYWJlbC5zaXplID0gNSwgcHQuc2l6ZSA9IDAuNSwgY2VsbHMuaGlnaGxpZ2h0ID0gbm90X2Fzc2lnbmVkX2NlbGxzLCBkaW1zID0gYygyLDEpLCByZWR1Y3Rpb24gPSAiRElNX1VNQVAiKSArCiMgICBjb29yZF9maXhlZCgpICsgCiMgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiMwMDAwMDAiLCAiI2Y1NGUxZSIpKQpgYGAKCmBgYHtyfQojIyByYXcgbnVtYmVycyBmb3IgZWFjaCBpZGVudGl0eQp0YWJsZShtb25vY2xlLm9iamVjdF9tYWxlQGNvbERhdGEkaWRlbnRpdHlfY29tYmluZWQpCnRhYmxlKG1vbm9jbGUub2JqZWN0X2ZlbWFsZUBjb2xEYXRhJGlkZW50aXR5X2NvbWJpbmVkKQp0YWJsZShtb25vY2xlLm9iamVjdF9iaXBvdEBjb2xEYXRhJGlkZW50aXR5X2NvbWJpbmVkKQoKIyMgcmVtb3ZlIGNlbGxzIG5vdCBzb3J0ZWQgdW5iaWFzZWRseQp0YWJsZShtb25vY2xlLm9iamVjdF9tYWxlQGNvbERhdGFbbW9ub2NsZS5vYmplY3RfbWFsZUBjb2xEYXRhJGV4Y2x1ZGVfZm9yX3NleF9yYXRpbyA9PSBGQUxTRSAmICFpcy5uYShtb25vY2xlLm9iamVjdF9tYWxlQGNvbERhdGEkZXhjbHVkZV9mb3Jfc2V4X3JhdGlvKSwgXSRpZGVudGl0eV9jb21iaW5lZCkKdGFibGUobW9ub2NsZS5vYmplY3RfZmVtYWxlQGNvbERhdGFbbW9ub2NsZS5vYmplY3RfZmVtYWxlQGNvbERhdGEkZXhjbHVkZV9mb3Jfc2V4X3JhdGlvID09IEZBTFNFICYgIWlzLm5hKG1vbm9jbGUub2JqZWN0X2ZlbWFsZUBjb2xEYXRhJGV4Y2x1ZGVfZm9yX3NleF9yYXRpbyksIF0kaWRlbnRpdHlfY29tYmluZWQpCnRhYmxlKG1vbm9jbGUub2JqZWN0X2JpcG90QGNvbERhdGFbbW9ub2NsZS5vYmplY3RfYmlwb3RAY29sRGF0YSRleGNsdWRlX2Zvcl9zZXhfcmF0aW8gPT0gRkFMU0UgJiAhaXMubmEobW9ub2NsZS5vYmplY3RfYmlwb3RAY29sRGF0YSRleGNsdWRlX2Zvcl9zZXhfcmF0aW8pLCBdJGlkZW50aXR5X2NvbWJpbmVkKQoKIyMgY29ycmVjdCBmb3IgY2x1c3RlcnMKbV9tZXRhIDwtIG1vbm9jbGUub2JqZWN0X21hbGVAY29sRGF0YQptX21ldGEgPC0gbV9tZXRhW21fbWV0YSRleGNsdWRlX2Zvcl9zZXhfcmF0aW8gPT0gRkFMU0UgJiAhaXMubmEobV9tZXRhJGV4Y2x1ZGVfZm9yX3NleF9yYXRpbyksIF0KbV9tZXRhIDwtIG1fbWV0YVt3aGljaChtX21ldGEkc2V1cmF0X2NsdXN0ZXJzICVpbiUgYyg1LCAxMCwgNCwgOSwgMTIsIDE2KSksIF0KdGFibGUobV9tZXRhJGlkZW50aXR5X2NvbWJpbmVkKQoKZl9tZXRhIDwtIG1vbm9jbGUub2JqZWN0X2ZlbWFsZUBjb2xEYXRhCmZfbWV0YSA8LSBmX21ldGFbZl9tZXRhJGV4Y2x1ZGVfZm9yX3NleF9yYXRpbyA9PSBGQUxTRSAmICFpcy5uYShmX21ldGEkZXhjbHVkZV9mb3Jfc2V4X3JhdGlvKSwgXQpmX21ldGEgPC0gZl9tZXRhW3doaWNoKGZfbWV0YSRzZXVyYXRfY2x1c3RlcnMgJWluJSBjKDE0LCAxNSwgMTMsIDgsIDExLCA3LCAwKSksIF0KdGFibGUoZl9tZXRhJGlkZW50aXR5X2NvbWJpbmVkKQoKYl9tZXRhIDwtIG1vbm9jbGUub2JqZWN0X2JpcG90QGNvbERhdGEKYl9tZXRhIDwtIGJfbWV0YVtiX21ldGEkZXhjbHVkZV9mb3Jfc2V4X3JhdGlvID09IEZBTFNFICYgIWlzLm5hKGJfbWV0YSRleGNsdWRlX2Zvcl9zZXhfcmF0aW8pLCBdCmJfbWV0YSA8LSBiX21ldGFbd2hpY2goYl9tZXRhJHNldXJhdF9jbHVzdGVycyAlaW4lIGMoMSwgMiwgMywgNikpLCBdCnRhYmxlKGJfbWV0YSRpZGVudGl0eV9jb21iaW5lZCkKYGBgCgoKYGBge3J9CiMjIGNyZWF0ZSBhbm5vdGF0aW9uIGRhdGFmcmFtZSBmcm9tIHRoZXNlIHJlc3VsdHM6CmRmX21vbm9jbGVfc2V4ZXMgPC0gcmJpbmQoZGF0YS5mcmFtZSgiY2VsbF9uYW1lIiA9IGNvbG5hbWVzKG1vbm9jbGUub2JqZWN0X21hbGUpLCAic2V4IiA9IHJlcCgiTWFsZSIsIGxlbmd0aChjb2xuYW1lcyhtb25vY2xlLm9iamVjdF9tYWxlKSkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZyYW1lKCJjZWxsX25hbWUiID0gY29sbmFtZXMobW9ub2NsZS5vYmplY3RfZmVtYWxlKSwgInNleCIgPSByZXAoIkZlbWFsZSIsIGxlbmd0aChjb2xuYW1lcyhtb25vY2xlLm9iamVjdF9mZW1hbGUpKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZnJhbWUoImNlbGxfbmFtZSIgPSBjb2xuYW1lcyhtb25vY2xlLm9iamVjdF9iaXBvdCksICJzZXgiID0gcmVwKCJCaXBvdGVudGlhbCIsIGxlbmd0aChjb2xuYW1lcyhtb25vY2xlLm9iamVjdF9iaXBvdCkpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICApCgpkaW0oZGZfbW9ub2NsZV9zZXhlcykKCiMjIG9yZGVyIGxpa2UgdGhlIG1ldGFkYXRhCmRmX21vbm9jbGVfc2V4ZXMgPC0gZGZfbW9ub2NsZV9zZXhlc1ttYXRjaChyb3duYW1lcyhtb25vY2xlLm9iamVjdC5zZXhAY29sRGF0YSksIGRmX21vbm9jbGVfc2V4ZXMkY2VsbF9uYW1lKSwgXQoKIyMgYWRkIHRoaXMgYmFjayBpbnRvIHRoZSBtb25vY2xlIG9iamVjdAptb25vY2xlLm9iamVjdC5zZXhAY29sRGF0YSRTZXhlc19tb25vY2xlIDwtIGRmX21vbm9jbGVfc2V4ZXMkc2V4CmBgYAoKIyMjIyBQc2V1ZG90aW1lIENhbGN1bGF0aW9uCmBgYHtyfQojIyBPcmRlciB0aGUgY2VsbHMgYW5kIGNhbGN1bGF0ZSBwc2V1ZG90aW1lCm1vbm9jbGUub2JqZWN0LnNleCA9IG9yZGVyX2NlbGxzKG1vbm9jbGUub2JqZWN0LnNleCkKCiMjIFBsb3QKdW1hcF9wdCA8LSBwbG90X2NlbGxzKG1vbm9jbGUub2JqZWN0LnNleCwgY29sb3JfY2VsbHNfYnkgPSAicHNldWRvdGltZSIsIGxhYmVsX2NlbGxfZ3JvdXBzPUZBTFNFLCBjZWxsX3NpemUgPSAxLCB4ID0gMSwgeSA9IDIsIGxhYmVsX2JyYW5jaF9wb2ludHM9RkFMU0UsIGxhYmVsX2xlYXZlcz1GQUxTRSwgbGFiZWxfZ3JvdXBzX2J5X2NsdXN0ZXI9RkFMU0UsIGxhYmVsX3Jvb3RzID0gRkFMU0UpICsKICBjb29yZF9maXhlZCgpICsKICB0aGVtZV92b2lkKCkgKwogIGxhYnModGl0bGUgPSAiUHNldWRvdGltZSIpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplPTE1KSwgbGVnZW5kLnBvc2l0aW9uPSJyaWdodCIsIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQgKHNpemU9MTApLCBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMCkpICsgCiAgZ3VpZGVzKGNvbG91ciA9IGd1aWRlX2NvbG91cmJhcihiYXJ3aWR0aCA9IDAuNSwgYmFyaGVpZ2h0ID0gMTAsIHRpdGxlID0gIlBzZXVkb3RpbWUiKSkKCiMjIHZpZXcKdW1hcF9wdApgYGAKCmFkZCBwdCB0byBtb25vY2xlCmBgYHtyfQojIyBleHRyYWN0IHB0IHZhbHVlcwpwdF92YWx1ZXMgPC0gYXMuZGF0YS5mcmFtZShwc2V1ZG90aW1lKG1vbm9jbGUub2JqZWN0LnNleCwgcmVkdWN0aW9uX21ldGhvZCA9ICJVTUFQIikpCgojIyBhZGQgdG8gbW9ub2NsZQptb25vY2xlLm9iamVjdC5zZXhAY29sRGF0YSRwc2V1ZG90aW1lIDwtIHB0X3ZhbHVlc1sgLDFdCgoKIyMgYWRkIHRvIHNldXJhdAojdGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXggPC0gQWRkTWV0YURhdGEodGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXgsIHB0X3ZhbHVlcywgInB0X3ZhbHVlcyIpCmBgYAoKYGBge3J9CiMjIHBsb3QKIyNleHRyYWN0IHB0IHZhbHVlcwpkZl9wdF9pZCA8LSBtb25vY2xlLm9iamVjdC5zZXhAY29sRGF0YVssYygicHNldWRvdGltZSIsICJTZXhlc19tb25vY2xlIildCiMjIGV4dHJhY3QgVU1BUCBjb29yZHMKZGZfdW1hcF9wbG90IDwtIHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QHJlZHVjdGlvbnNbWyJESU1fUENBIl1dQGNlbGwuZW1iZWRkaW5ncwpkZl91bWFwX3Bsb3QgPC0gbWVyZ2UoZGZfdW1hcF9wbG90LCBkZl9wdF9pZCwgYnk9MCwgYWxsPVRSVUUpCgojIyBhZGQgdHJlZQojI1RoZSB0cmVlIGZvciBtb25vY2xlIGlzIGxvY2F0ZWQgaGVyZToKIyBtb25vY2xlLm9iamVjdEBwcmluY2lwYWxfZ3JhcGhfYXV4W1siVU1BUCJdXSRkcF9tc3QgCmljYV9zcGFjZV9kZiA8LSB0KG1vbm9jbGUub2JqZWN0LnNleEBwcmluY2lwYWxfZ3JhcGhfYXV4W1siVU1BUCJdXSRkcF9tc3QpICU+JQogICAgICBhcy5kYXRhLmZyYW1lKCkgJT4lCiAgICAgIGRwbHlyOjpzZWxlY3RfKHByaW5fZ3JhcGhfZGltXzEgPSAiRElNUENBXzEiLCBwcmluX2dyYXBoX2RpbV8yID0gIkRJTVBDQV8yIikgJT4lCiAgICAgIGRwbHlyOjptdXRhdGUoc2FtcGxlX25hbWUgPSByb3duYW1lcyguKSwKICAgICAgICAgICAgICAgICAgICBzYW1wbGVfc3RhdGUgPSByb3duYW1lcyguKSkKCmRwX21zdCA8LSBtb25vY2xlLm9iamVjdC5zZXhAcHJpbmNpcGFsX2dyYXBoW1siVU1BUCJdXQoKZWRnZV9kZiA8LSBkcF9tc3QgJT4lCiAgICAgIGlncmFwaDo6YXNfZGF0YV9mcmFtZSgpICU+JQogICAgICBkcGx5cjo6c2VsZWN0Xyhzb3VyY2UgPSAiZnJvbSIsIHRhcmdldCA9ICJ0byIpICU+JQogICAgICBkcGx5cjo6bGVmdF9qb2luKGljYV9zcGFjZV9kZiAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgIGRwbHlyOjpzZWxlY3RfKAogICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U9InNhbXBsZV9uYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlX3ByaW5fZ3JhcGhfZGltXzE9InByaW5fZ3JhcGhfZGltXzEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VfcHJpbl9ncmFwaF9kaW1fMj0icHJpbl9ncmFwaF9kaW1fMiIpLAogICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gInNvdXJjZSIpICU+JQogICAgICBkcGx5cjo6bGVmdF9qb2luKGljYV9zcGFjZV9kZiAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgIGRwbHlyOjpzZWxlY3RfKAogICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9InNhbXBsZV9uYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3ByaW5fZ3JhcGhfZGltXzE9InByaW5fZ3JhcGhfZGltXzEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfcHJpbl9ncmFwaF9kaW1fMj0icHJpbl9ncmFwaF9kaW1fMiIpLAogICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gInRhcmdldCIpCgojIyBtYWtlIGdncGxvdAp1bWFwX2lkX3B0IDwtIGdncGxvdChkZl91bWFwX3Bsb3QsIGFlcyh4ID0gRElNUENBXzEsIHkgPSBESU1QQ0FfMikpICsgCiAgICAgICAgICAgICAgICAgICAgIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gcHNldWRvdGltZSksIHNpemUgPSAwLjEpICsKICAgICAgICAgICAgICAgICAgICAgc2NhbGVfY29sb3VyX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICAgICAgICAgICAgICAgICAgICAgdGhlbWVfdm9pZCgpICsKICAgICAgICAgICAgICAgICAgICAgY29vcmRfZml4ZWQoKSArCiAgICAgICAgICAgICAgICAgICAgIGdlb21fc2VnbWVudChhZXNfc3RyaW5nKHg9InNvdXJjZV9wcmluX2dyYXBoX2RpbV8xIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk9InNvdXJjZV9wcmluX2dyYXBoX2RpbV8yIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhlbmQ9InRhcmdldF9wcmluX2dyYXBoX2RpbV8xIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllbmQ9InRhcmdldF9wcmluX2dyYXBoX2RpbV8yIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YT1lZGdlX2RmKSArCiAgICAgICAgICAgICAgICAgICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhbWlseT0iQXJpYWwiLCBzaXplID0gMTMsIGZhY2UgPSAiYm9sZCIpKSArCiAgICAgICAgICAgICAgICAgICAgIGxhYnModGl0bGUgPSAiUHNldWRvdGltZSIpCgp1bWFwX2lkX3B0CmBgYAoKcGxvdCBvZiBjZWxsIGlkZW50aXR5OgpgYGB7ciwgZmlnLmhlaWdodCA9IDQsIGZpZy53aWR0aCA9IDR9CiMjIGV4dHJhY3QgbWV0YSBkYXRhCmRmX3BjYSA8LXRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YQojIyBtYWtlIG5ldyBjb2wKZGZfcGNhJGFzc2lnbm1lbnQgPC0gInVuYXNzaWduZWQiCgojIyBub3cgYWRkIG90aGVyIGFubm90YXRpb25zCiMjIGNvcnJlY3QgZm9yIGNsdXN0ZXJzCiMjIHRoZSBwcm9ibGVtIHdpdGggdGhpcyBhcHByb2FjaCBpcyB0aGF0IGNlbGxzIHRoYXQgYXJlIG5hIGZvciB1bmJpYXNlZCBzb3J0aW5nIGFyZSBleGNsdWRlZAojZGZfcGNhJGFzc2lnbm1lbnRbd2hpY2gocm93bmFtZXMoZGZfcGNhKSAlaW4lIHJvd25hbWVzKG1fbWV0YSkpXSA8LSAibWFsZSIKI2RmX3BjYSRhc3NpZ25tZW50W3doaWNoKHJvd25hbWVzKGRmX3BjYSkgJWluJSByb3duYW1lcyhmX21ldGEpKV0gPC0gImZlbWFsZSIKI2RmX3BjYSRhc3NpZ25tZW50W3doaWNoKHJvd25hbWVzKGRmX3BjYSkgJWluJSByb3duYW1lcyhiX21ldGEpKV0gPC0gImJpcG9lbnRpYWwiCiMjIGNvcnJlY3QgZm9yIGNsdXN0ZXJzCm1fbWV0YV8yIDwtIG1vbm9jbGUub2JqZWN0X21hbGVAY29sRGF0YQptX21ldGFfMiA8LSBtX21ldGFfMlt3aGljaChtX21ldGFfMiRzZXVyYXRfY2x1c3RlcnMgJWluJSBjKDUsIDEwLCA0LCA5LCAxMiwgMTYpKSwgXQoKZl9tZXRhXzIgPC0gbW9ub2NsZS5vYmplY3RfZmVtYWxlQGNvbERhdGEKZl9tZXRhXzIgPC0gZl9tZXRhXzJbd2hpY2goZl9tZXRhXzIkc2V1cmF0X2NsdXN0ZXJzICVpbiUgYygxNCwgMTUsIDEzLCA4LCAxMSwgNywgMCkpLCBdCgpiX21ldGFfMiA8LSBtb25vY2xlLm9iamVjdF9iaXBvdEBjb2xEYXRhCmJfbWV0YV8yIDwtIGJfbWV0YV8yW3doaWNoKGJfbWV0YV8yJHNldXJhdF9jbHVzdGVycyAlaW4lIGMoMSwgMiwgMywgNikpLCBdCgpkZl9wY2EkYXNzaWdubWVudFt3aGljaChyb3duYW1lcyhkZl9wY2EpICVpbiUgcm93bmFtZXMobV9tZXRhXzIpKV0gPC0gIm1hbGUiCmRmX3BjYSRhc3NpZ25tZW50W3doaWNoKHJvd25hbWVzKGRmX3BjYSkgJWluJSByb3duYW1lcyhmX21ldGFfMikpXSA8LSAiZmVtYWxlIgpkZl9wY2EkYXNzaWdubWVudFt3aGljaChyb3duYW1lcyhkZl9wY2EpICVpbiUgcm93bmFtZXMoYl9tZXRhXzIpKV0gPC0gInByb2dlbml0b3IiCgojIyBhZGQgYmFjayB0byBtZXRhIGRhdGEKdGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXggPC0gQWRkTWV0YURhdGEodGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXgsIGRmX3BjYSRhc3NpZ25tZW50LCBjb2wubmFtZSA9ICJhc3NpZ25tZW50IikKCiMjIHJlbW92ZSB0aGVzZSBvYmplY3RzIHRvIHNhdmUgc3BhY2UKcm0obV9tZXRhXzIsIGZfbWV0YV8yLCBiX21ldGFfMikKCiMjIG1ha2UgYSBjdXN0b20gcGFsCiMgMSA9IGJsdWUgLSAiIzAwNTJjNSIKIyAyID0gcmVkIC0gIiNhNTJiMWUiCiMgMyA9IGdyZWVuIC0gIiMwMTZjMDAiCiMgNCA9IHllbGxvdyAtICIjZmZlNDAwIgpwYWxfc2V4IDwtIGMoIiMwMTZjMDAiLCAiI2E1MmIxZSIsICIjZmZlNDAwIiwgIiNFN0U4RUEiKQoKVU1BUF9pZGVudGl0eSA8LSBEaW1QbG90KHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4LCBsYWJlbCA9IEZBTFNFLCByZXBlbCA9IFRSVUUsIHB0LnNpemUgPSAwLjUsIGdyb3VwLmJ5ID0gImFzc2lnbm1lbnQiLCBkaW1zID0gYygxLDIpLCByZWR1Y3Rpb24gPSAiRElNX1BDQSIpICsKICBjb29yZF9maXhlZCgpICsgCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9cGFsX3NleCkgKyAKICB0aGVtZV92b2lkKCkgKyAKICAjdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQogICMjIGFkZCBzZXggc3ltYm9scwogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDMwLCB5ID0gLTUwLCBsYWJlbCA9IG1hbGVfc3ltYm9sLCBzaXplPTcsIGNvbG9yPSIjYTUyYjFlIikgKyAKICBhbm5vdGF0ZSgidGV4dCIsIHggPSA1MCwgeSA9IC0xMCwgbGFiZWwgPSBmZW1hbGVfc3ltYm9sLCBzaXplPTcsIGNvbG9yPSIjMDE2YzAwIikgKwogIGxhYnModGl0bGUgPSAnJykKCiMjIHByaW50ClVNQVBfaWRlbnRpdHkKYGBgCgoKcGxvdCBwc2V1ZG90aW1lIHZzLiBnZW5vdHlwZQpgYGB7cn0KIyMgZXh0cmFjdCBzZXhlcwptYWxlX2RmIDwtIGFzLmRhdGEuZnJhbWUobW9ub2NsZS5vYmplY3Quc2V4QGNvbERhdGFbd2hpY2gobW9ub2NsZS5vYmplY3Quc2V4QGNvbERhdGEkU2V4ZXNfbW9ub2NsZSA9PSAiTWFsZSIpLCBdKQpmZW1hbGVfZGYgPC0gYXMuZGF0YS5mcmFtZShtb25vY2xlLm9iamVjdC5zZXhAY29sRGF0YVt3aGljaChtb25vY2xlLm9iamVjdC5zZXhAY29sRGF0YSRTZXhlc19tb25vY2xlID09ICJGZW1hbGUiKSwgXSkKCiMjIHRoZW4gb25seSBpbmNsdWRlIGNlbGxzIHRoYXQgYXJlOgojIyAxLiB1bmJpYXNlZGx5IHNvcnRlZAojIyAyLiBpbiB0aGUgcmlnaHQgY2x1c3RlcgpmZW1hbGVfZGYgPC0gZmVtYWxlX2RmW2ZlbWFsZV9kZiRleGNsdWRlX2Zvcl9zZXhfcmF0aW8gPT0gRkFMU0UgfCBpcy5uYShmZW1hbGVfZGYkZXhjbHVkZV9mb3Jfc2V4X3JhdGlvKSwgXQpmZW1hbGVfZGYgPC0gZmVtYWxlX2RmW3doaWNoKGZlbWFsZV9kZiRzZXVyYXRfY2x1c3RlcnMgJWluJSBjKDE0LCAxNSwgMTMsIDgsIDExLCA3LCAwKSksIF0KbWFsZV9kZiA8LSBtYWxlX2RmW21hbGVfZGYkZXhjbHVkZV9mb3Jfc2V4X3JhdGlvID09IEZBTFNFIHwgaXMubmEobWFsZV9kZiRleGNsdWRlX2Zvcl9zZXhfcmF0aW8pLCBdCm1hbGVfZGYgPC0gbWFsZV9kZlt3aGljaChtYWxlX2RmJHNldXJhdF9jbHVzdGVycyAlaW4lIGMoNSwgMTAsIDQsIDksIDEyLCAxNikpLCBdCgojIyBkZWZpbmUgdGhlIGRhdGFmcmFtZXMKbWFsZV9kZiRpZGVudGl0eV9jb21iaW5lZCA8LSBmYWN0b3IobWFsZV9kZiRpZGVudGl0eV9jb21iaW5lZCwgbGV2ZWxzID0gcmV2KGMoIm1kMSIsICJtZDIiLCAibWQzIiwgIm1kNCIsICJtZDUiLCAiZ2QxIiwgImZkMSIsICJmZDIiLCAiZmQzIiwgImZkNCIsICAid2lsZC10eXBlICgxMHgpIiwgIndpbGQtdHlwZSAoU21hcnQtc2VxMikiKSkpCmZlbWFsZV9kZiRpZGVudGl0eV9jb21iaW5lZCA8LSBmYWN0b3IoZmVtYWxlX2RmJGlkZW50aXR5X2NvbWJpbmVkLCBsZXZlbHMgPSByZXYoYygibWQxIiwgIm1kMiIsICJtZDMiLCAibWQ0IiwgIm1kNSIsICJnZDEiLCAiZmQxIiwgImZkMiIsICJmZDMiLCAiZmQ0IiwgIndpbGQtdHlwZSAoMTB4KSIsICJ3aWxkLXR5cGUgKFNtYXJ0LXNlcTIpIikpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDV9CmxpYnJhcnkoZ2dyaWRnZXMpCiMjIHBsb3QgZmVtYWxlcyAKcDEgPC0gZ2dwbG90KGZlbWFsZV9kZiwgYWVzKHggPSBwc2V1ZG90aW1lLCB5ID0gIGlkZW50aXR5X2NvbWJpbmVkLCBmaWxsID0gc3RhdCh4KSkpICsKICBnZW9tX2RlbnNpdHlfcmlkZ2VzX2dyYWRpZW50KHNjYWxlID0gMC45LCByZWxfbWluX2hlaWdodCA9IDAuMDMsICBxdWFudGlsZV9saW5lcyA9IFRSVUUsIHF1YW50aWxlcyA9IDIsIHBvaW50X2FscGhhID0gMC41LCBhbHBoYSA9IDAuOCkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgc2NhbGVfeV9kaXNjcmV0ZShkcm9wPUZBTFNFKSArCiAgbGFicyh0aXRsZSA9ICdGZW1hbGUnLCB4ID0gIkZlbWFsZSBCcmFuY2ggUHNldWRvdGltZSIsIHkgPSAiR2Vub3R5cGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzX2MobmFtZSA9ICJwc2V1ZG90aW1lIiwgb3B0aW9uID0gIkMiLCBhbHBoYSA9IDEpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfbGluZShzaXplID0gKDAuMiksIGNvbG91cj0iZ3JleSIpLAogICAgICAgIGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCkpCgojIyBwbG90IG1hbGVzCnAyIDwtIGdncGxvdChtYWxlX2RmLCBhZXMoeCA9IHBzZXVkb3RpbWUsIHkgPSAgaWRlbnRpdHlfY29tYmluZWQsIGZpbGwgPSBzdGF0KHgpKSkgKwogIGdlb21fZGVuc2l0eV9yaWRnZXNfZ3JhZGllbnQoc2NhbGUgPSAwLjksIHJlbF9taW5faGVpZ2h0ID0gMC4wMywgIHF1YW50aWxlX2xpbmVzID0gVFJVRSwgcXVhbnRpbGVzID0gMiwgcG9pbnRfYWxwaGEgPSAwLjUsIGFscGhhID0gMC44LCBuYS5ybSA9IEZBTFNFKSAgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgc2NhbGVfeV9kaXNjcmV0ZShkcm9wPUZBTFNFKSArCiAgbGFicyh0aXRsZSA9ICdNYWxlJywgeCA9ICJNYWxlIEJyYW5jaCBQc2V1ZG90aW1lIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKG5hbWUgPSAicHNldWRvdGltZSIsIG9wdGlvbiA9ICJDIiwgYWxwaGEgPSAxKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfbGluZShzaXplID0gKDAuMiksIGNvbG91cj0iZ3JleSIpLAogICAgICAgIGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS55PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55PWVsZW1lbnRfYmxhbmsoKSkKCnBsb3RfZ3JpZChwMSwgcDIsIG5yb3cgPSAxLCBhbGlnbiA9ICJoIiwgYXhpcyA9ICJiIikKI2xpYnJhcnkoZWdnKQojZWdnOjpnZ2FycmFuZ2UocDEsIHAyLCAgbnJvdyA9IDEpCgojZ3JpZC5uZXdwYWdlKCkKI2dyaWQuZHJhdyhjYmluZChnZ3Bsb3RHcm9iKHAxKSwgZ2dwbG90R3JvYihwMiksIHNpemUgPSAibGFzdCIpKQpgYGAKCmBgYHtyfQpjb21iaW5lZF9kZiA8LSByYmluZChtYWxlX2RmLCBmZW1hbGVfZGYpCgpjb21iaW5lZF9yaWRnZV9wbG90cyA8LSBnZ3Bsb3QoY29tYmluZWRfZGYsIGFlcyh4ID0gcHNldWRvdGltZSwgeSA9ICBpZGVudGl0eV9jb21iaW5lZCwgZmlsbCA9IHN0YXQoeCkpKSArCiAgZ2VvbV9kZW5zaXR5X3JpZGdlc19ncmFkaWVudChzY2FsZSA9IDAuOSwgcmVsX21pbl9oZWlnaHQgPSAwLjAzLCAgcXVhbnRpbGVfbGluZXMgPSBUUlVFLCBxdWFudGlsZXMgPSAyLCBwb2ludF9hbHBoYSA9IDAuNSwgYWxwaGEgPSAwLjgpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHNjYWxlX3lfZGlzY3JldGUoZHJvcD1GQUxTRSkgKwogIGxhYnModGl0bGUgPSAnJywgeCA9ICJQc2V1ZG90aW1lIiwgeSA9ICIiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzX2MobmFtZSA9ICJwc2V1ZG90aW1lIiwgb3B0aW9uID0gIkMiLCBhbHBoYSA9IDEpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfbGluZShzaXplID0gKDAuMiksIGNvbG91cj0iZ3JleSIpLAogICAgICAgIGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCkpICsgCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhTZXhlc19tb25vY2xlKSkKCmNvbWJpbmVkX3JpZGdlX3Bsb3RzCmBgYAoKYGBge3J9CmxpYnJhcnkoZ3JpZEV4dHJhKQoKY29tYmluZWRfZGYgPC0gcmJpbmQobWFsZV9kZiwgZmVtYWxlX2RmKQp4IDwtIGFzLmRhdGEuZnJhbWUoYXMubWF0cml4LmRhdGEuZnJhbWUodGFibGUoY29tYmluZWRfZGYkU2V4ZXNfbW9ub2NsZSwgY29tYmluZWRfZGYkaWRlbnRpdHlfY29tYmluZWQpKSkKY29sbmFtZXMoeCkgPC0gY29sbmFtZXMoYXMubWF0cml4KHRhYmxlKGNvbWJpbmVkX2RmJFNleGVzX21vbm9jbGUsIGNvbWJpbmVkX2RmJGlkZW50aXR5X2NvbWJpbmVkKSkpCnJvd25hbWVzKHgpIDwtIHJvd25hbWVzKGFzLm1hdHJpeCh0YWJsZShjb21iaW5lZF9kZiRTZXhlc19tb25vY2xlLCBjb21iaW5lZF9kZiRpZGVudGl0eV9jb21iaW5lZCkpKQojIyB0cmFuc2Zvcm0KeCA8LSB0KHgpCiMjIHJldmVyc2Ugb3JkZXIgb2Ygcm93cyB0byBtYXRjaCBwbG90cwp4PC0geFtzZXEoZGltKHgpWzFdLDEpLF0Kc3MgPC0gdGFibGVHcm9iKHgsIHRoZW1lID0gdHRoZW1lX21pbmltYWwoYmFzZV9mYW1pbHkgPSAiQXJpYWwiKSwgcm93cz1OVUxMKQpncmlkLmFycmFuZ2Uoc3MpCmBgYAoKYGBge3J9CnBsb3RfZ3JpZChjb21iaW5lZF9yaWRnZV9wbG90cywgc3MsIG5yb3cgPSAxLCByZWxfd2lkdGhzID0gYygzLCAxKSkKYGBgCgpgYGB7ciwgZmlnLmhlaWdodCA9IDExLjcsIGZpZy53aWR0aCA9IDguM30KIyMgQQpjb21wb3NpdGVfY2VsbF9sb2NhdGlvbnMgPC0gcGxvdF9ncmlkKChVTUFQX2lkZW50aXR5ICsgbGFicyh0aXRsZT0iICIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgZmFtaWx5PSJBcmlhbCIsIHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIiksIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bWFwX2lkX3B0ICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfcGxvdHNfc2V4X2hpZ2hsaWdodFtbM11dLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X3Bsb3RzX3NleF9oaWdobGlnaHRbWzRdXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9wbG90c19zZXhfaGlnaGxpZ2h0W1s1XV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfcGxvdHNfc2V4X2hpZ2hsaWdodFtbNl1dLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X3Bsb3RzX3NleF9oaWdobGlnaHRbWzddXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9wbG90c19zZXhfaGlnaGxpZ2h0W1s4XV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfcGxvdHNfc2V4X2hpZ2hsaWdodFtbOV1dLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X3Bsb3RzX3NleF9oaWdobGlnaHRbWzEwXV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfcGxvdHNfc2V4X2hpZ2hsaWdodFtbMTFdXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9wbG90c19zZXhfaGlnaGxpZ2h0W1sxMl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaXN0X3Bsb3RzX3NleF9oaWdobGlnaHRbWzFdXSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhbWlseT0iQXJpYWwiLCBzaXplID0gMTIsIGZhY2UgPSAiYm9sZCIpLCBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBmYW1pbHk9IkFyaWFsIiwgc2l6ZSA9IDEyLCBmYWNlID0gImJvbGQiKSwgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArIGxhYnModGl0bGU9IndpbGQtdHlwZSIsIHN1YnRpdGxlPSIoMTB4KSIpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxpc3RfcGxvdHNfc2V4X2hpZ2hsaWdodFtbMl1dICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgZmFtaWx5PSJBcmlhbCIsIHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIiksIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhbWlseT0iQXJpYWwiLCBzaXplID0gMTIsIGZhY2UgPSAiYm9sZCIpLCBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsgbGFicyh0aXRsZT0id2lsZC10eXBlIiwgc3VidGl0bGU9IihTbWFydC1zZXEyKSIpKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJvdyA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcyA9IGMoImIiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKCkIgPC0gcGxvdF9ncmlkKGNvbWJpbmVkX3JpZGdlX3Bsb3RzLCBzcywgbnJvdyA9IDEsIHJlbF93aWR0aHMgPSBjKDMsIDEpKQoKIyMgbGFiZWxzIGFzIHVwcGVyY2FzZSBsZXR0ZXJzOgojYyh0b3VwcGVyKGxldHRlcnMpWzI6MTddKQojIGxhYmVscyBhcyByb21hbiBudW1lcmFsczoKIyBjKHRvbG93ZXIoYXMucm9tYW4oYygyOjE3KSkKCkZpZ3VyZV9wdWJsaWNhdGlvbiA8LSBwbG90X2dyaWQoY29tcG9zaXRlX2NlbGxfbG9jYXRpb25zLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIGFkZCBlbXB0eSBwbG90IHRvIGdpdmUgc3BhY2luZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZ3Bsb3QoKSArIHRoZW1lX3ZvaWQoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnJywgJycpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbF9zaXplID0gMTIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jb2wgPSAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBucm93PTMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF9oZWlnaHRzID0gYygxLCAxLCAxKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsX3dpZHRocyA9IGMoMSwgMSwgMSkpCgojZ2dkcmF3KCkgKwojICBkcmF3X3Bsb3QoY29tcG9zaXRlX2NlbGxfbG9jYXRpb25zLCAwLCAuNSwgMSwgLjUpICsKIyAgZHJhd19wbG90KGNvbWJpbmVkX3JpZGdlX3Bsb3RzLCAwLCAwLCAuNSwgLjUpICsKIyAgZHJhd19wbG90KHNzLCAuNSwgMCwgLjUsIC41KQoKRmlndXJlX3B1YmxpY2F0aW9uCmBgYAoKc2F2ZQpgYGB7cn0KZ2dzYXZlKCIuLi9pbWFnZXNfdG9fZXhwb3J0L0ZpZ3VyZV80LnBuZyIsIHBsb3QgPSBGaWd1cmVfcHVibGljYXRpb24sIGRldmljZSA9ICJwbmciLCBwYXRoID0gTlVMTCwgc2NhbGUgPSAxLCB3aWR0aCA9IDIxLCBoZWlnaHQgPSAyOS43LCB1bml0cyA9ICJjbSIsIGRwaSA9IDMwMCwgbGltaXRzaXplID0gVFJVRSkKYGBgCgoKIyBEaWZmZXJlbnRpYWwgZXhwcmVzc2lvbgoKYGBge3J9CnRhYmxlKHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YSRpZGVudGl0eV9jb21iaW5lZCwgdGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXgkc2V1cmF0X2NsdXN0ZXJzKQpgYGAKCmBgYHtyfQojIyBtYWtlIHBhbAojcGFsX2RlIDwtIGMoZGl2ZXJnaW5nX2hjbCgyLCBwYWxldHRlID0gIkJlcmxpbiIpWzFdLCIjRTJFMkUyIiwgZGl2ZXJnaW5nX2hjbCgyLCBwYWxldHRlID0gIkJlcmxpbiIpWzJdKQoKIyMgbWFrZSBkZiBvZiBhYm92ZSB0YWJsZQpkZiA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YSRpZGVudGl0eV9jb21iaW5lZCwgdGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXgkc2V1cmF0X2NsdXN0ZXJzKSkKIyMgY2hhbmdlIG5hbWVzCm5hbWVzKGRmKSA8LSBjKCJHZW5vdHlwZSIsICJDbHVzdGVyIiwgIkZyZXF1ZW5jeSIpCiMjIHJlb3JkZXIgZmFjdG9yIGxldmVscwpkZiRHZW5vdHlwZSA8LSBmYWN0b3IoZGYkR2Vub3R5cGUsbGV2ZWxzID0gcmV2KGxldmVscyhkZiRHZW5vdHlwZSkpKQoKIyMgYWRkIGNvbG91ciBjb2x1bW4gZm9yIGNsdXN0ZXJzIGFjdHVhbGx5IGNvbXBhcmVkCmRmJGNvbCA8LSAid2hpdGUiCmRmW2RmJEdlbm90eXBlID09ICJtZDMiICYgZGYkQ2x1c3RlciA9PSAiNCIsIF0kY29sIDwtICJtdXRhbnQiCmRmW2RmJEdlbm90eXBlID09ICJtZDQiICYgZGYkQ2x1c3RlciA9PSAiMTIiLCBdJGNvbCA8LSAibXV0YW50IgpkZltkZiRHZW5vdHlwZSA9PSAibWQ1IiAmIGRmJENsdXN0ZXIgPT0gIjEwIiwgXSRjb2wgPC0gIm11dGFudCIKZGZbZGYkR2Vub3R5cGUgPT0gImdkMSIgJiBkZiRDbHVzdGVyID09ICIxMiIsIF0kY29sIDwtICJtdXRhbnQiCmRmW2RmJEdlbm90eXBlID09ICJmZDEiICYgZGYkQ2x1c3RlciA9PSAiOCIsIF0kY29sIDwtICJtdXRhbnQiCmRmW2RmJEdlbm90eXBlID09ICJmZDIiICYgZGYkQ2x1c3RlciA9PSBjKCI4IiwgIjE1IiksIF0kY29sIDwtICJtdXRhbnQiCmRmW2RmJEdlbm90eXBlID09ICJmZDMiICYgZGYkQ2x1c3RlciA9PSAiMCIsIF0kY29sIDwtICJtdXRhbnQiCmRmW2RmJEdlbm90eXBlID09ICJmZDQiICYgZGYkQ2x1c3RlciA9PSAiMCIsIF0kY29sIDwtICJtdXRhbnQiCmRmWyhkZiRHZW5vdHlwZSA9PSAid2lsZC10eXBlICgxMHgpIiB8IGRmJEdlbm90eXBlID09ICJ3aWxkLXR5cGUgKFNtYXJ0LXNlcTIpIikgJiAoZGYkQ2x1c3RlciA9PSAiMCIgfCBkZiRDbHVzdGVyID09ICI0IiB8IGRmJENsdXN0ZXIgPT0gIjgiIHwgZGYkQ2x1c3RlciA9PSAiMTAiIHwgZGYkQ2x1c3RlciA9PSAiMTIiIHwgZGYkQ2x1c3RlciA9PSAiMTUiKSwgXSRjb2wgPC0gIndpbGQtdHlwZSIKCmRlX3RhYmxlIDwtIGdncGxvdChkZiwgYWVzKENsdXN0ZXIsIEdlbm90eXBlKSkgKwogICAgZ2VvbV90aWxlKGFlcyhmaWxsID0gY29sKSwgY29sb3IgPSAiYmxhY2siKSArIAogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKEZyZXF1ZW5jeSwgMSkpKSArCiAgY29vcmRfZml4ZWQoKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKGJyZWFrcyA9IGMoIm11dGFudCIsICJ3aWxkLXR5cGUiKSwgdmFsdWVzID0gYyhkaXZlcmdpbmdfaGNsKDIsIHBhbGV0dGUgPSAiQmVybGluIilbMl0sIiNmZmZmZmYiLCBkaXZlcmdpbmdfaGNsKDIsIHBhbGV0dGUgPSAiQmVybGluIilbMV0pKSArCiAgbGFicyhmaWxsPSJVc2VkIGZvciBERSBhbmFseXNpcyIpICsgCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUsIGNvbG9yID0gImJsYWNrIiksIGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIikKCmRlX3RhYmxlCmBgYAoKYGBge3J9Cmdnc2F2ZSgiLi4vaW1hZ2VzX3RvX2V4cG9ydC9ERV90YWJsZS5wbmciLCBwbG90ID0gZGVfdGFibGUsIGRldmljZSA9ICJwbmciLCBwYXRoID0gTlVMTCwgc2NhbGUgPSAxLCB3aWR0aCA9IDIwLCBoZWlnaHQgPSAzMCwgdW5pdHMgPSAiY20iLCBkcGkgPSAzMDAsIGxpbWl0c2l6ZSA9IFRSVUUpCmBgYAoKCkZyb20gdGhpcywgd2Ugc2hvdWxkIGNvbXBhcmUgZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gYXMgc3VjaDoKCm1kMyAtIDQKbWQ0IC0gMTIKbWQ1IC0gMTAKZ2QxIC0gMTIgb3IgMTYgKHNlZW1zIHRvIGJlIGl0J3Mgb3duIGNsdXN0ZXIpPwpmZDEgLSA4CmZkMiAtIGhhcyBpdCdzIG93biBjbHVzdGVyIG9mIDE1IC0gY29tcGFyZSAxNSB0byA4CmZkMyAtIDAgLSBub3QgbWFueSBjZWxscwpmZDQgLSAwIC0gbm90IG1hbnkgY2VsbHMKKiBmb3IgZmQzIGFuZCBmZDQgeW91IGNvdWxkIGRvIG90aGVyIGNsdXN0ZXJzIGFuZCBsb29rIGF0IGNoYW5nZXMgYWxvbmcgZGV2LgoKVGhpbmdzIHRvIGxvb2sgZm9yOgoKMS4gaXMgdGhlIGV4cHJlc3Npb24gb2YgdGhlIG1hcmtlciAoaW4gbXV0YW50cyB0aGF0IG1ha2UgaXQgdG8gdGhlIGVuZCBvZiBnYW1ldG9jeXRvZ2VuZXNpcykgaW4gdGhlIDgyMCBsaW5lcyBkaXN0dXJiZWQ/CjIuIEFyZSBhbnkgb2YgdGhlIG90aGVyIHNjcmVlbiBoaXRzIGRpc3R1cmJlZD8KMy4gV2hhdCBpcyB0aGUgZW5yaWNobWVudCBvZiB0aGVzZSBnZW5lcyBpbiAKCiMjIyBtZDMKCmBgYHtyfQpjZWxscy40IDwtIHN1YnNldCh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleCwgaWRlbnRzID0gIjQiKQpEZWZhdWx0QXNzYXkoY2VsbHMuNCkgPC0gIlJOQSIKSWRlbnRzKGNlbGxzLjQpIDwtICJpZGVudGl0eV9jb21iaW5lZCIKbWQzX21hcmtlcnMgPC0gRmluZE1hcmtlcnMoY2VsbHMuNCwgaWRlbnQuMSA9ICJtZDMiLCBpZGVudC4yID0gYygid2lsZC10eXBlICgxMHgpIiwgIndpbGQtdHlwZSAoU21hcnQtc2VxMikiKSwgdGVzdC51c2UgPSAiTUFTVCIsIHZlcmJvc2UgPSBGQUxTRSkKbWQzX21hcmtlcnMgPC0gbWQzX21hcmtlcnNbbWQzX21hcmtlcnMkcF92YWxfYWRqIDwgMC4wNSwgXQpoZWFkKG1kM19tYXJrZXJzLCBuID0gMTUpCm1kM19tYXJrZXJzX2Fubm90YXRlZCA8LSBtZXJnZShnZW5lX2Fubm90YXRpb25zLCBtZDNfbWFya2VycywgYnkueCA9ICJHZW5lLklEIiwgYnkueSA9IDApClZpZXcobWQzX21hcmtlcnNfYW5ub3RhdGVkKQpgYGAKCmBgYHtyfQpWbG5QbG90KGNlbGxzLjQsIGZlYXR1cmVzID0gYygiUEJBTktBLTEwMzAxMDAiLCAiUEJBTktBLTEyMDY5MDAiKSwgZ3JvdXAuYnkgPSAiaWRlbnRpdHlfY29tYmluZWQiLCBwdC5zaXplID0gMCwgY29tYmluZSA9IEZBTFNFLCBzbG90ID0gImRhdGEiLCBhc3NheSA9ICJSTkEiKQpgYGAKCmBgYHtyfQpjZWxsc190b19wbG90IDwtIHJvd25hbWVzKHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YVt0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGEkaWRlbnRpdHlfY29tYmluZWQgPT0gYygid2lsZC10eXBlICgxMHgpIiwgIndpbGQtdHlwZSAoU21hcnQtc2VxMikiLCAibWQzIiksIF0pCkZlYXR1cmVQbG90KHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4LCBmZWF0dXJlcyA9IGMoIlBCQU5LQS0xMDMwMTAwIiwgIlBCQU5LQS0xMjA2OTAwIiksIGRpbXMgPSBjKDEsMiksIHJlZHVjdGlvbiA9ICJESU1fUENBIiwgY2VsbHMgPSBjZWxsc190b19wbG90LCBzcGxpdC5ieSA9ICJnZW5vdHlwZV9jb21iaW5lZCIpCmBgYAoKClNvbWUgaXNzdWVzIHdpdGggYWN0aW4gMiBhbmQgYmV0YSB0dWJ1bGluIHdoaWNoIG1heSBwcmV2ZW50IGEgZnVsbHkgZmVydGlsZSBnYW1ldG9jeXRlCgojIyBtZDQKCmBgYHtyfQpjZWxscy4xMiA8LSBzdWJzZXQodGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXgsIGlkZW50cyA9ICIxMiIpCkRlZmF1bHRBc3NheShjZWxscy4xMikgPC0gIlJOQSIKSWRlbnRzKGNlbGxzLjEyKSA8LSAiaWRlbnRpdHlfY29tYmluZWQiCm1kNF9tYXJrZXJzIDwtIEZpbmRNYXJrZXJzKGNlbGxzLjEyLCBpZGVudC4xID0gIm1kNCIsIGlkZW50LjIgPSBjKCJ3aWxkLXR5cGUgKDEweCkiLCAid2lsZC10eXBlIChTbWFydC1zZXEyKSIpLCB0ZXN0LnVzZSA9ICJNQVNUIiwgdmVyYm9zZSA9IEZBTFNFKQptZDRfbWFya2VycyA8LSBtZDRfbWFya2Vyc1ttZDRfbWFya2VycyRwX3ZhbF9hZGogPCAwLjA1LCBdCmhlYWQobWQ0X21hcmtlcnMsIG4gPSAxNSkKbWQ0X21hcmtlcnNfYW5ub3RhdGVkIDwtIG1lcmdlKGdlbmVfYW5ub3RhdGlvbnMsIG1kNF9tYXJrZXJzLCBieS54ID0gIkdlbmUuSUQiLCBieS55ID0gMCkKVmlldyhtZDRfbWFya2Vyc19hbm5vdGF0ZWQpCmBgYAoKYGBge3J9ClZsblBsb3QoY2VsbHMuMTIsIGZlYXR1cmVzID0gYygiUEJBTktBLTEyMDk4MDAiLCAiUEJBTktBLTAyMTE1MDAiLCAiUEJBTktBLTEyMjI5MDAiLCAiUEJBTktBLTEzMTI3MDAiKSwgZ3JvdXAuYnkgPSAiaWRlbnRpdHlfY29tYmluZWQiLCBwdC5zaXplID0gMCwgY29tYmluZSA9IEZBTFNFLCBzbG90ID0gImRhdGEiLCBhc3NheSA9ICJSTkEiKQpgYGAKCiMjIG1kNQoKYGBge3J9CmNlbGxzLjEwIDwtIHN1YnNldCh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleCwgaWRlbnRzID0gIjEwIikKRGVmYXVsdEFzc2F5KGNlbGxzLjEwKSA8LSAiUk5BIgpJZGVudHMoY2VsbHMuMTApIDwtICJpZGVudGl0eV9jb21iaW5lZCIKbWQ1X21hcmtlcnMgPC0gRmluZE1hcmtlcnMoY2VsbHMuMTAsIGlkZW50LjEgPSAibWQ1IiwgaWRlbnQuMiA9IGMoIndpbGQtdHlwZSAoMTB4KSIsICJ3aWxkLXR5cGUgKFNtYXJ0LXNlcTIpIiksIHRlc3QudXNlID0gIk1BU1QiLCB2ZXJib3NlID0gRkFMU0UpCm1kNV9tYXJrZXJzIDwtIG1kNV9tYXJrZXJzW21kNV9tYXJrZXJzJHBfdmFsX2FkaiA8IDAuMDUsIF0KaGVhZChtZDVfbWFya2VycywgbiA9IDE1KQptZDVfbWFya2Vyc19hbm5vdGF0ZWQgPC0gbWVyZ2UoZ2VuZV9hbm5vdGF0aW9ucywgbWQ1X21hcmtlcnMsIGJ5LnggPSAiR2VuZS5JRCIsIGJ5LnkgPSAwKQpWaWV3KG1kNV9tYXJrZXJzX2Fubm90YXRlZCkKYGBgCgojIyBnZDEKCmBgYHtyfQpjZWxscy4xMiA8LSBzdWJzZXQodGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXgsIGlkZW50cyA9ICIxMiIpCkRlZmF1bHRBc3NheShjZWxscy4xMikgPC0gIlJOQSIKSWRlbnRzKGNlbGxzLjEyKSA8LSAiaWRlbnRpdHlfY29tYmluZWQiCmdkMV9tYXJrZXJzIDwtIEZpbmRNYXJrZXJzKGNlbGxzLjEyLCBpZGVudC4xID0gImdkMSIsIGlkZW50LjIgPSBjKCJ3aWxkLXR5cGUgKDEweCkiLCAid2lsZC10eXBlIChTbWFydC1zZXEyKSIpLCB0ZXN0LnVzZSA9ICJNQVNUIiwgdmVyYm9zZSA9IEZBTFNFKQpnZDFfbWFya2VycyA8LSBnZDFfbWFya2Vyc1tnZDFfbWFya2VycyRwX3ZhbF9hZGogPCAwLjA1LCBdCmhlYWQoZ2QxX21hcmtlcnMsIG4gPSAxNSkKZ2QxX21hcmtlcnNfYW5ub3RhdGVkIDwtIG1lcmdlKGdlbmVfYW5ub3RhdGlvbnMsIGdkMV9tYXJrZXJzLCBieS54ID0gIkdlbmUuSUQiLCBieS55ID0gMCkKVmlldyhnZDFfbWFya2Vyc19hbm5vdGF0ZWQpCmBgYAoKIyMgZmQxCgpgYGB7cn0KY2VsbHMuOCA8LSBzdWJzZXQodGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXgsIGlkZW50cyA9ICI4IikKRGVmYXVsdEFzc2F5KGNlbGxzLjgpIDwtICJSTkEiCklkZW50cyhjZWxscy44KSA8LSAiaWRlbnRpdHlfY29tYmluZWQiCmZkMV9tYXJrZXJzIDwtIEZpbmRNYXJrZXJzKGNlbGxzLjgsIGlkZW50LjEgPSAiZmQxIiwgaWRlbnQuMiA9IGMoIndpbGQtdHlwZSAoMTB4KSIsICJ3aWxkLXR5cGUgKFNtYXJ0LXNlcTIpIiksIHRlc3QudXNlID0gIk1BU1QiLCB2ZXJib3NlID0gRkFMU0UpCmZkMV9tYXJrZXJzIDwtIGZkMV9tYXJrZXJzW2ZkMV9tYXJrZXJzJHBfdmFsX2FkaiA8IDAuMDUsIF0KaGVhZChmZDFfbWFya2VycywgbiA9IDE1KQpmZDFfbWFya2Vyc19hbm5vdGF0ZWQgPC0gbWVyZ2UoZ2VuZV9hbm5vdGF0aW9ucywgZmQxX21hcmtlcnMsIGJ5LnggPSAiR2VuZS5JRCIsIGJ5LnkgPSAwKQpWaWV3KGZkMV9tYXJrZXJzX2Fubm90YXRlZCkKYGBgCgojIyBmZDIgCgpgYGB7cn0KY2VsbHMuMTUuOCA8LSBzdWJzZXQodGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXgsIGlkZW50cyA9IGMoIjE1IiwgIjgiKSkKRGVmYXVsdEFzc2F5KGNlbGxzLjE1LjgpIDwtICJSTkEiCklkZW50cyhjZWxscy4xNS44KSA8LSAiaWRlbnRpdHlfY29tYmluZWQiCmZkMl9tYXJrZXJzIDwtIEZpbmRNYXJrZXJzKGNlbGxzLjE1LjgsIGlkZW50LjEgPSAiZmQyIiwgaWRlbnQuMiA9IGMoIndpbGQtdHlwZSAoMTB4KSIsICJ3aWxkLXR5cGUgKFNtYXJ0LXNlcTIpIiksIHRlc3QudXNlID0gIk1BU1QiLCB2ZXJib3NlID0gRkFMU0UpCmZkMl9tYXJrZXJzIDwtIGZkMl9tYXJrZXJzW2ZkMl9tYXJrZXJzJHBfdmFsX2FkaiA8IDAuMDUsIF0KaGVhZChmZDJfbWFya2VycywgbiA9IDE1KQpmZDJfbWFya2Vyc19hbm5vdGF0ZWQgPC0gbWVyZ2UoZ2VuZV9hbm5vdGF0aW9ucywgZmQyX21hcmtlcnMsIGJ5LnggPSAiR2VuZS5JRCIsIGJ5LnkgPSAwKQpWaWV3KGZkMl9tYXJrZXJzX2Fubm90YXRlZCkKYGBgCgojIyBmZDMgCgpgYGB7cn0KY2VsbHMuMCA8LSBzdWJzZXQodGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXgsIGlkZW50cyA9ICIwIikKRGVmYXVsdEFzc2F5KGNlbGxzLjApIDwtICJSTkEiCklkZW50cyhjZWxscy4wKSA8LSAiaWRlbnRpdHlfY29tYmluZWQiCmZkM19tYXJrZXJzIDwtIEZpbmRNYXJrZXJzKGNlbGxzLjAsIGlkZW50LjEgPSAiZmQzIiwgaWRlbnQuMiA9IGMoIndpbGQtdHlwZSAoMTB4KSIsICJ3aWxkLXR5cGUgKFNtYXJ0LXNlcTIpIiksIHRlc3QudXNlID0gIk1BU1QiLCB2ZXJib3NlID0gRkFMU0UpCmZkM19tYXJrZXJzIDwtIGZkM19tYXJrZXJzW2ZkM19tYXJrZXJzJHBfdmFsX2FkaiA8IDAuMDUsIF0KaGVhZChmZDNfbWFya2VycywgbiA9IDE1KQpmZDNfbWFya2Vyc19hbm5vdGF0ZWQgPC0gbWVyZ2UoZ2VuZV9hbm5vdGF0aW9ucywgZmQzX21hcmtlcnMsIGJ5LnggPSAiR2VuZS5JRCIsIGJ5LnkgPSAwKQpWaWV3KGZkM19tYXJrZXJzX2Fubm90YXRlZCkKYGBgCgojIyBmZDQKCmBgYHtyfQpjZWxscy4wIDwtIHN1YnNldCh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleCwgaWRlbnRzID0gIjAiKQpEZWZhdWx0QXNzYXkoY2VsbHMuMCkgPC0gIlJOQSIKSWRlbnRzKGNlbGxzLjApIDwtICJpZGVudGl0eV9jb21iaW5lZCIKZmQ0X21hcmtlcnMgPC0gRmluZE1hcmtlcnMoY2VsbHMuMCwgaWRlbnQuMSA9ICJmZDQiLCBpZGVudC4yID0gYygid2lsZC10eXBlICgxMHgpIiwgIndpbGQtdHlwZSAoU21hcnQtc2VxMikiKSwgdGVzdC51c2UgPSAiTUFTVCIsIHZlcmJvc2UgPSBGQUxTRSkKZmQ0X21hcmtlcnMgPC0gZmQ0X21hcmtlcnNbZmQ0X21hcmtlcnMkcF92YWxfYWRqIDwgMC4wNSwgXQpoZWFkKGZkNF9tYXJrZXJzLCBuID0gMTUpCmZkNF9tYXJrZXJzX2Fubm90YXRlZCA8LSBtZXJnZShnZW5lX2Fubm90YXRpb25zLCBmZDRfbWFya2VycywgYnkueCA9ICJHZW5lLklEIiwgYnkueSA9IDApClZpZXcoZmQ0X21hcmtlcnNfYW5ub3RhdGVkKQpgYGAKCnNhdmUgcmVzdWx0cyBvZiBERSBpbnRvIGV4Y2VsCmBgYHtyfQpsaWJyYXJ5KHhsc3gpCndyaXRlLnhsc3gobWQzX21hcmtlcnNfYW5ub3RhdGVkLCBmaWxlPSIuLi9kYXRhX3RvX2V4cG9ydC9ERV9hbmFseXNpcy54bHN4Iiwgc2hlZXROYW1lPSJtZDMiLCByb3cubmFtZXM9RkFMU0UpCndyaXRlLnhsc3gobWQ0X21hcmtlcnNfYW5ub3RhdGVkLCBmaWxlPSIuLi9kYXRhX3RvX2V4cG9ydC9ERV9hbmFseXNpcy54bHN4Iiwgc2hlZXROYW1lPSJtZDQiLCBhcHBlbmQ9VFJVRSwgcm93Lm5hbWVzPUZBTFNFKQp3cml0ZS54bHN4KG1kNV9tYXJrZXJzX2Fubm90YXRlZCwgZmlsZT0iLi4vZGF0YV90b19leHBvcnQvREVfYW5hbHlzaXMueGxzeCIsIHNoZWV0TmFtZT0ibWQ1IiwgYXBwZW5kPVRSVUUsIHJvdy5uYW1lcz1GQUxTRSkKd3JpdGUueGxzeChnZDFfbWFya2Vyc19hbm5vdGF0ZWQsIGZpbGU9Ii4uL2RhdGFfdG9fZXhwb3J0L0RFX2FuYWx5c2lzLnhsc3giLCBzaGVldE5hbWU9ImdkMSIsIGFwcGVuZD1UUlVFLCByb3cubmFtZXM9RkFMU0UpCndyaXRlLnhsc3goZmQxX21hcmtlcnNfYW5ub3RhdGVkLCBmaWxlPSIuLi9kYXRhX3RvX2V4cG9ydC9ERV9hbmFseXNpcy54bHN4Iiwgc2hlZXROYW1lPSJmZDEiLCBhcHBlbmQ9VFJVRSwgcm93Lm5hbWVzPUZBTFNFKQp3cml0ZS54bHN4KGZkMl9tYXJrZXJzX2Fubm90YXRlZCwgZmlsZT0iLi4vZGF0YV90b19leHBvcnQvREVfYW5hbHlzaXMueGxzeCIsIHNoZWV0TmFtZT0iZmQyIiwgYXBwZW5kPVRSVUUsIHJvdy5uYW1lcz1GQUxTRSkKd3JpdGUueGxzeChmZDNfbWFya2Vyc19hbm5vdGF0ZWQsIGZpbGU9Ii4uL2RhdGFfdG9fZXhwb3J0L0RFX2FuYWx5c2lzLnhsc3giLCBzaGVldE5hbWU9ImZkMyIsIGFwcGVuZD1UUlVFLCByb3cubmFtZXM9RkFMU0UpCndyaXRlLnhsc3goZmQ0X21hcmtlcnNfYW5ub3RhdGVkLCBmaWxlPSIuLi9kYXRhX3RvX2V4cG9ydC9ERV9hbmFseXNpcy54bHN4Iiwgc2hlZXROYW1lPSJmZDQiLCBhcHBlbmQ9VFJVRSwgcm93Lm5hbWVzPUZBTFNFKQpgYGAKCmhvdyBtYW55IERFIGdlbmVzIHBlciBjb25kaXRpb24/CgpgYGB7cn0KZGltKG1kM19tYXJrZXJzX2Fubm90YXRlZClbMV0KZGltKG1kNF9tYXJrZXJzX2Fubm90YXRlZClbMV0KZGltKG1kNV9tYXJrZXJzX2Fubm90YXRlZClbMV0KZGltKGdkMV9tYXJrZXJzX2Fubm90YXRlZClbMV0KZGltKGZkMV9tYXJrZXJzX2Fubm90YXRlZClbMV0KZGltKGZkMl9tYXJrZXJzX2Fubm90YXRlZClbMV0KZGltKGZkM19tYXJrZXJzX2Fubm90YXRlZClbMV0KZGltKGZkNF9tYXJrZXJzX2Fubm90YXRlZClbMV0KYGBgCgp3aXRoIGZpbHRlcnMgb2YgMiBmb2xkIGNoYW5nZSB1cCBvciBkb3duIChlLmcuIDAuNSAgPiBsb2dGQyA+IDEpCgpgYGB7cn0KZGltKG1kM19tYXJrZXJzX2Fubm90YXRlZFttZDNfbWFya2Vyc19hbm5vdGF0ZWQkYXZnX2xvZ0ZDID4gMSB8IG1kM19tYXJrZXJzX2Fubm90YXRlZCRhdmdfbG9nRkMgPCAwLjUsIF0pWzFdCmRpbShtZDRfbWFya2Vyc19hbm5vdGF0ZWRbbWQ0X21hcmtlcnNfYW5ub3RhdGVkJGF2Z19sb2dGQyA+IDEgfCBtZDRfbWFya2Vyc19hbm5vdGF0ZWQkYXZnX2xvZ0ZDIDwgMC41LCBdKVsxXQpkaW0obWQ1X21hcmtlcnNfYW5ub3RhdGVkW21kNV9tYXJrZXJzX2Fubm90YXRlZCRhdmdfbG9nRkMgPiAxIHwgbWQ1X21hcmtlcnNfYW5ub3RhdGVkJGF2Z19sb2dGQyA8IDAuNSwgXSlbMV0KZGltKGdkMV9tYXJrZXJzX2Fubm90YXRlZFtnZDFfbWFya2Vyc19hbm5vdGF0ZWQkYXZnX2xvZ0ZDID4gMSB8IGdkMV9tYXJrZXJzX2Fubm90YXRlZCRhdmdfbG9nRkMgPCAwLjUsIF0pWzFdCmRpbShmZDFfbWFya2Vyc19hbm5vdGF0ZWRbZmQxX21hcmtlcnNfYW5ub3RhdGVkJGF2Z19sb2dGQyA+IDEgfCBmZDFfbWFya2Vyc19hbm5vdGF0ZWQkYXZnX2xvZ0ZDIDwgMC41LCBdKVsxXQpkaW0oZmQyX21hcmtlcnNfYW5ub3RhdGVkW2ZkMl9tYXJrZXJzX2Fubm90YXRlZCRhdmdfbG9nRkMgPiAxIHwgZmQyX21hcmtlcnNfYW5ub3RhdGVkJGF2Z19sb2dGQyA8IDAuNSwgXSlbMV0KZGltKGZkM19tYXJrZXJzX2Fubm90YXRlZFtmZDNfbWFya2Vyc19hbm5vdGF0ZWQkYXZnX2xvZ0ZDID4gMSB8IGZkM19tYXJrZXJzX2Fubm90YXRlZCRhdmdfbG9nRkMgPCAwLjUsIF0pWzFdCmRpbShmZDRfbWFya2Vyc19hbm5vdGF0ZWRbZmQ0X21hcmtlcnNfYW5ub3RhdGVkJGF2Z19sb2dGQyA+IDEgfCBmZDRfbWFya2Vyc19hbm5vdGF0ZWQkYXZnX2xvZ0ZDIDwgMC41LCBdKVsxXQpgYGAKCmZpbHRlcgpgYGB7cn0KbWQzX21hcmtlcnNfYW5ub3RhdGVkX2ZpbHRlcmVkIDwtIG1kM19tYXJrZXJzX2Fubm90YXRlZFttZDNfbWFya2Vyc19hbm5vdGF0ZWQkYXZnX2xvZ0ZDID4gMSB8IG1kM19tYXJrZXJzX2Fubm90YXRlZCRhdmdfbG9nRkMgPCAwLjUsIF0KbWQ0X21hcmtlcnNfYW5ub3RhdGVkX2ZpbHRlcmVkIDwtIG1kNF9tYXJrZXJzX2Fubm90YXRlZFttZDRfbWFya2Vyc19hbm5vdGF0ZWQkYXZnX2xvZ0ZDID4gMSB8IG1kNF9tYXJrZXJzX2Fubm90YXRlZCRhdmdfbG9nRkMgPCAwLjUsIF0KbWQ1X21hcmtlcnNfYW5ub3RhdGVkX2ZpbHRlcmVkIDwtIG1kNV9tYXJrZXJzX2Fubm90YXRlZFttZDVfbWFya2Vyc19hbm5vdGF0ZWQkYXZnX2xvZ0ZDID4gMSB8IG1kNV9tYXJrZXJzX2Fubm90YXRlZCRhdmdfbG9nRkMgPCAwLjUsIF0KZ2QxX21hcmtlcnNfYW5ub3RhdGVkX2ZpbHRlcmVkIDwtIGdkMV9tYXJrZXJzX2Fubm90YXRlZFtnZDFfbWFya2Vyc19hbm5vdGF0ZWQkYXZnX2xvZ0ZDID4gMSB8IGdkMV9tYXJrZXJzX2Fubm90YXRlZCRhdmdfbG9nRkMgPCAwLjUsIF0KZmQxX21hcmtlcnNfYW5ub3RhdGVkX2ZpbHRlcmVkIDwtIGZkMV9tYXJrZXJzX2Fubm90YXRlZFtmZDFfbWFya2Vyc19hbm5vdGF0ZWQkYXZnX2xvZ0ZDID4gMSB8IGZkMV9tYXJrZXJzX2Fubm90YXRlZCRhdmdfbG9nRkMgPCAwLjUsIF0KZmQyX21hcmtlcnNfYW5ub3RhdGVkX2ZpbHRlcmVkIDwtIGZkMl9tYXJrZXJzX2Fubm90YXRlZFtmZDJfbWFya2Vyc19hbm5vdGF0ZWQkYXZnX2xvZ0ZDID4gMSB8IGZkMl9tYXJrZXJzX2Fubm90YXRlZCRhdmdfbG9nRkMgPCAwLjUsIF0KZmQzX21hcmtlcnNfYW5ub3RhdGVkX2ZpbHRlcmVkIDwtIGZkM19tYXJrZXJzX2Fubm90YXRlZFtmZDNfbWFya2Vyc19hbm5vdGF0ZWQkYXZnX2xvZ0ZDID4gMSB8IGZkM19tYXJrZXJzX2Fubm90YXRlZCRhdmdfbG9nRkMgPCAwLjUsIF0KZmQ0X21hcmtlcnNfYW5ub3RhdGVkX2ZpbHRlcmVkIDwtIGZkNF9tYXJrZXJzX2Fubm90YXRlZFtmZDRfbWFya2Vyc19hbm5vdGF0ZWQkYXZnX2xvZ0ZDID4gMSB8IGZkNF9tYXJrZXJzX2Fubm90YXRlZCRhdmdfbG9nRkMgPCAwLjUsIF0KYGBgCgoKYmFzaWMgdmVubgoKYGBge3J9CmxpYnJhcnkoZ2d2ZW5uKQojIyBzZXQgdXAgcGFsZXR0ZQojIyB0aGVyZSBhcmUgOCBERSBnZW5vdHlwZXMgCnF1YWxpdGF0aXZlX2hjbCg4LCBwYWxldHRlID0gIlBhc3RlbCAxIikKCiMjIG1ha2UgbGlzdHMgCmEgPC0gbGlzdChgbWQzYCA9IG1kM19tYXJrZXJzX2Fubm90YXRlZF9maWx0ZXJlZCRHZW5lLklELAogICAgICAgICAgYG1kNGAgPSBtZDRfbWFya2Vyc19hbm5vdGF0ZWRfZmlsdGVyZWQkR2VuZS5JRCwKICAgICAgICAgIGBtZDVgID0gbWQ1X21hcmtlcnNfYW5ub3RhdGVkX2ZpbHRlcmVkJEdlbmUuSUQsCiAgICAgICAgICBgZ2QxYCA9IGdkMV9tYXJrZXJzX2Fubm90YXRlZF9maWx0ZXJlZCRHZW5lLklEKQojIyBwbG90CnZlbm5fbWFsZV9tZDMgPC0gZ2d2ZW5uKGEsIAogICAgICAgYygibWQzIiwgIm1kNCIsICJtZDUiLCAiZ2QxIiksCiAgICAgICBmaWxsX2NvbG9yID0gYyhxdWFsaXRhdGl2ZV9oY2woOCwgcGFsZXR0ZSA9ICJQYXN0ZWwgMSIpWzFdLCBxdWFsaXRhdGl2ZV9oY2woOCwgcGFsZXR0ZSA9ICJQYXN0ZWwgMSIpWzJdLCBxdWFsaXRhdGl2ZV9oY2woOCwgcGFsZXR0ZSA9ICJQYXN0ZWwgMSIpWzNdLCBxdWFsaXRhdGl2ZV9oY2woOCwgcGFsZXR0ZSA9ICJQYXN0ZWwgMSIpWzRdKSwKICAgICAgIHN0cm9rZV9zaXplID0gMC41LCBzZXRfbmFtZV9zaXplID0gNCxzaG93X3BlcmNlbnRhZ2UgPSBGQUxTRSwKICAgICAgIGZpbGxfYWxwaGEgPSAwLjUKICAgICAgICkgCnZlbm5fbWFsZV9tZDMKYGBgCnNhdmUKYGBge3J9Cmdnc2F2ZSgiLi4vaW1hZ2VzX3RvX2V4cG9ydC92ZW5uX21hbGVfbWQzLnBuZyIsIHBsb3QgPSB2ZW5uX21hbGVfbWQzLCBkZXZpY2UgPSAicG5nIiwgcGF0aCA9IE5VTEwsIHNjYWxlID0gMSwgd2lkdGggPSA1LCBoZWlnaHQgPSA1LCB1bml0cyA9ICJjbSIsIGRwaSA9IDMwMCwgbGltaXRzaXplID0gVFJVRSkKYGBgCgpgYGB7cn0KbGlicmFyeSgiY29sb3JzcGFjZSIpCiMjIG1ha2UgbGlzdHMgCmEgPC0gbGlzdChgbWQ0YCA9IG1kNF9tYXJrZXJzX2Fubm90YXRlZF9maWx0ZXJlZCRHZW5lLklELAogICAgICAgICAgYG1kNWAgPSBtZDVfbWFya2Vyc19hbm5vdGF0ZWRfZmlsdGVyZWQkR2VuZS5JRCwKICAgICAgICAgIGBnZDFgID0gZ2QxX21hcmtlcnNfYW5ub3RhdGVkX2ZpbHRlcmVkJEdlbmUuSUQpCiMjIHBsb3QKdmVubl9tYWxlIDwtIGdndmVubihhLCAKICAgICAgIGMoIm1kNCIsICJtZDUiLCAiZ2QxIiksCiAgICAgICBmaWxsX2NvbG9yID0gYyhxdWFsaXRhdGl2ZV9oY2woOCwgcGFsZXR0ZSA9ICJQYXN0ZWwgMSIpWzJdLCBxdWFsaXRhdGl2ZV9oY2woOCwgcGFsZXR0ZSA9ICJQYXN0ZWwgMSIpWzNdLCBxdWFsaXRhdGl2ZV9oY2woOCwgcGFsZXR0ZSA9ICJQYXN0ZWwgMSIpWzRdKSwKICAgICAgIHN0cm9rZV9zaXplID0gMC41LCAKICAgICAgIHNldF9uYW1lX3NpemUgPSA0LAogICAgICAgc2hvd19wZXJjZW50YWdlID0gRkFMU0UsCiAgICAgICBmaWxsX2FscGhhID0gMC41CiAgICAgICApCnZlbm5fbWFsZQpgYGAKc2F2ZQpgYGB7cn0KZ2dzYXZlKCIuLi9pbWFnZXNfdG9fZXhwb3J0L3Zlbm5fbWFsZS5wbmciLCBwbG90ID0gdmVubl9tYWxlLCBkZXZpY2UgPSAicG5nIiwgcGF0aCA9IE5VTEwsIHNjYWxlID0gMSwgd2lkdGggPSA1LCBoZWlnaHQgPSA1LCB1bml0cyA9ICJjbSIsIGRwaSA9IDMwMCwgbGltaXRzaXplID0gVFJVRSkKYGBgCgpgYGB7cn0KbGlicmFyeSgiY29sb3JzcGFjZSIpCiMjIG1ha2UgbGlzdHMgCmEgPC0gbGlzdChgZmQxYCA9IGZkMV9tYXJrZXJzX2Fubm90YXRlZF9maWx0ZXJlZCRHZW5lLklELAogICAgICAgICAgYGZkMmAgPSBmZDJfbWFya2Vyc19hbm5vdGF0ZWRfZmlsdGVyZWQkR2VuZS5JRCwKICAgICAgICAgIGBmZDNgID0gZmQzX21hcmtlcnNfYW5ub3RhdGVkX2ZpbHRlcmVkJEdlbmUuSUQsCiAgICAgICAgICBgZmQ0YCA9IGZkNF9tYXJrZXJzX2Fubm90YXRlZF9maWx0ZXJlZCRHZW5lLklEKQojIyBwbG90CnZlbm5fZmVtYWxlIDwtIGdndmVubihhLCAKICAgICAgICNjKCJmZDEiLCAiZmQyIiwgImZkMyIsICJmZDQiKSwKICAgICAgIGZpbGxfY29sb3IgPSBjKHF1YWxpdGF0aXZlX2hjbCg4LCBwYWxldHRlID0gIlBhc3RlbCAxIilbNV0sIHF1YWxpdGF0aXZlX2hjbCg4LCBwYWxldHRlID0gIlBhc3RlbCAxIilbNl0sIHF1YWxpdGF0aXZlX2hjbCg4LCBwYWxldHRlID0gIlBhc3RlbCAxIilbN10sIHF1YWxpdGF0aXZlX2hjbCg4LCBwYWxldHRlID0gIlBhc3RlbCAxIilbOF0pLAogICAgICAgc3Ryb2tlX3NpemUgPSAwLjUsIAogICAgICAgc2V0X25hbWVfc2l6ZSA9IDQsCiAgICAgICBzaG93X3BlcmNlbnRhZ2UgPSBGQUxTRSwKICAgICAgIGZpbGxfYWxwaGEgPSAwLjUKICAgICAgICkKdmVubl9mZW1hbGUKYGBgCnNhdmUKYGBge3J9Cmdnc2F2ZSgiLi4vaW1hZ2VzX3RvX2V4cG9ydC92ZW5uX2ZlbWFsZS5wbmciLCBwbG90ID0gdmVubl9mZW1hbGUsIGRldmljZSA9ICJwbmciLCBwYXRoID0gTlVMTCwgc2NhbGUgPSAxLCB3aWR0aCA9IDUsIGhlaWdodCA9IDUsIHVuaXRzID0gImNtIiwgZHBpID0gMzAwLCBsaW1pdHNpemUgPSBUUlVFKQpgYGAKCiMjIyBERSBjb21wYXJpc29uIGZpZ3VyZXMKCmBgYHtyLCBmaWcud2lkdGggPSAxMCwgZmlnLmxlbmd0aCA9IDEwfQojIyBtYWtlIGxpc3Qgb2YgZ2Vub3R5cGVzCmxpc3Rfb2ZfZ2Vub3R5cGVzIDwtIHVuaXF1ZSh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGEkaWRlbnRpdHlfY29tYmluZWQpCiMjIHJlZG9yZGVyIGZvciBiZXR0ZXIgcGxvdHRpbmcgYW5kIHJlbW92ZSB3dCwgbWQxLCBhbmQgbWQyCmxpc3Rfb2ZfZ2Vub3R5cGVzIDwtIGxpc3Rfb2ZfZ2Vub3R5cGVzW2MoMTEsIDcsIDgsIDEyLCA1LCAxMCwgNiwgOSldCiMjIG1ha2UgYSBsaXN0IG9mIGNsdXN0ZXJzIHRvIGhpZ2hsaWdodCBmb3IgZWFjaCBnZW5vdHlwZQpsaXN0X29mX2NsdXN0ZXJzIDwtIGxpc3QoYygiNCIpLCBjKCIxMiIpLCBjKCIxMCIpLCBjKCIxMiIpLCBjKCI4IiksIGMoIjE1IiwgIjgiKSwgYygiMCIpLCBjKCIwIikpCgojIyBtYWtlIGEgYmxhbmsgbGlzdCBmb3IgcGxvdHMKbGlzdF9wbG90c19kZV9oaWdobGlnaHQgPC0gdmVjdG9yKG1vZGUgPSAibGlzdCIsIGxlbmd0aCA9IGxlbmd0aChsaXN0X29mX2dlbm90eXBlcykpCgojIyBtYWtlIHBhbApwYWxfZGUgPC0gYyhkaXZlcmdpbmdfaGNsKDIsIHBhbGV0dGUgPSAiQmVybGluIilbMl0sIiNFMkUyRTIiLCBkaXZlcmdpbmdfaGNsKDIsIHBhbGV0dGUgPSAiQmVybGluIilbMV0pCgojIyBmb3IgbG9vcApmb3IoaSBpbiBzZXFfYWxvbmcobGlzdF9vZl9nZW5vdHlwZXMpKXsKICAgICMjIG1ha2UgYSBsaXN0IG9mIGNlbGxzIHRvIGhpZ2hsaWdodCAtIGJ1dCBmb3Igd2lsZC10eXBlLCBpbmNsdWRlIGFsbCBjZWxscyBvZiB0aGF0IGdlbm90eXBlLCBub3QganVzdCBvbmVzIGV4Y2x1ZGVkIGZvciBzZXggcmF0aW8KICB1bWFwX3R4ID0gdGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXhAcmVkdWN0aW9uc1tbIkRJTV9QQ0EiXV1AY2VsbC5lbWJlZGRpbmdzCiAgdW1hcF90eCA8LSBtZXJnZSh1bWFwX3R4LCB0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGFbLGMoInNldXJhdF9jbHVzdGVycyIsICJpZGVudGl0eV9jb21iaW5lZCIpXSwgYnk9MCwgYWxsPVRSVUUpCiAgIyMgbWFrZSBhIG5ldyBibGFuayBjb2x1bW4KICB1bWFwX3R4JGNvbCA8LSAibm90LXByb2ZpbGVkIgogICMjIGFkZCBjb2xvdXJzIGZvciBlYWNoIGhpZ2hsaWdodGVkIGNsYXNzCiAgdW1hcF90eFt1bWFwX3R4JHNldXJhdF9jbHVzdGVycyA9PSBsaXN0X29mX2NsdXN0ZXJzW1tpXV0gJiB1bWFwX3R4JGlkZW50aXR5X2NvbWJpbmVkID09IGMoIndpbGQtdHlwZSAoMTB4KSIsIndpbGQtdHlwZSAoU21hcnQtc2VxMikiKSwgXSRjb2wgPC0gIndpbGQtdHlwZSIKICB1bWFwX3R4W3VtYXBfdHgkc2V1cmF0X2NsdXN0ZXJzID09IGxpc3Rfb2ZfY2x1c3RlcnNbW2ldXSAmIHVtYXBfdHgkaWRlbnRpdHlfY29tYmluZWQgPT0gbGlzdF9vZl9nZW5vdHlwZXNbaV0sIF0kY29sIDwtICJtdXRhbnQiCiAgIyMgbWFrZSBhIHNpemUgY29sdW1uIAogICN1bWFwX3R4W3VtYXBfdHgkY29sID09ICJub3QtcHJvZmlsZWQiLCBdJHB0X3NpemUgPC0gInNtYWxsIgogICN1bWFwX3R4W3VtYXBfdHgkY29sID09ICJ3aWxkLXR5cGUiIHwgdW1hcF90eCRjb2wgPT0gIm11dGFudCIsIF0kcHRfc2l6ZSA8LSAiYmlnIgogICMjIG9yZGVyIGNlbGxzIHNvIHRoYXQgcHJvZmlsZWQgY2VsbHMgYXJlIHBsb3R0ZWQgbGFzdAogIHVtYXBfdHggPC0gcmJpbmQodW1hcF90eFt1bWFwX3R4JGNvbCA9PSAibm90LXByb2ZpbGVkIiwgXSwgdW1hcF90eFt1bWFwX3R4JGNvbCA9PSAid2lsZC10eXBlIiwgXSwgdW1hcF90eFt1bWFwX3R4JGNvbCA9PSAibXV0YW50IiwgXSkKICAjIyBtYWtlIGEgcGxvdAogIHBjYV9wbG90IDwtIGdncGxvdCh1bWFwX3R4LCBhZXMoeCA9IERJTVBDQV8xLCB5ID0gRElNUENBXzIpKSArCiAgICAgICAgICAgICAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBjb2wsIHNpemUgPSBjb2wsIGFscGhhID0gY29sKSkgKwogICAgICAgICAgICAgIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPXBhbF9kZSkgKwogICAgICAgICAgICAgIHNjYWxlX3NpemVfbWFudWFsKHZhbHVlcz1jKDMsIDEsIDMpKSArCiAgICAgICAgICAgICAgc2NhbGVfYWxwaGFfbWFudWFsKHZhbHVlcz1jKDAuNSwgMSwgMC41KSkgKwogICAgICAgICAgICAgIGNvb3JkX2ZpeGVkKCkgKwogICAgICAgICAgICAgIHRoZW1lX3ZvaWQoKSArIAogICAgICAgICAgICAgIGxhYnModGl0bGUgPSBwYXN0ZShsaXN0X29mX2dlbm90eXBlc1tpXSkpICsgCiAgICAgICAgICAgICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgZmFtaWx5PSJBcmlhbCIsIHNpemUgPSAxNSwgZmFjZSA9ICJib2xkLml0YWxpYyIpLCBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCiAgIyMgYWRkIHRvIHRoZSBsaXN0CiAgbGlzdF9wbG90c19kZV9oaWdobGlnaHRbW2ldXSA8LSBwY2FfcGxvdAp9CmBgYApwbG90CmBgYHtyLCBmaWcuaGVpZ2h0ID0gMTAsIGZpZy53aWR0aCA9IDEwfQojIyB0aGlzIGZ1bmN0aW9uIHdyaXRlcyB0aGUgbmV4dCBiaXQgb2YgY29kZSBmb3IgeW91CiMjIHB1dCBpdCBpbnRvIHRoZSBjb25zb2xlIGFuZCBwYXN0ZSB0aGUgcmVzcG9uc2UKI3Bsb3R5IDwtIGMoKQojZm9yKGkgaW4gc2VxX2Fsb25nKGxpc3Rfb2ZfZ2Vub3R5cGVzKSl7CiMgIHBsb3R5IDwtIHBhc3RlMChwbG90eSwgImxpc3RfcGxvdHNfc2V4X2hpZ2hsaWdodFtbIiwgaSwgIl1dIiwgIiArICIpCiN9CgojIyBwbG90CmNvbXBvc2l0ZV9jZWxsX2xvY2F0aW9ucyA8LSBwbG90X2dyaWQobGlzdF9wbG90c19kZV9oaWdobGlnaHRbWzFdXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9wbG90c19kZV9oaWdobGlnaHRbWzJdXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9wbG90c19kZV9oaWdobGlnaHRbWzNdXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9wbG90c19kZV9oaWdobGlnaHRbWzRdXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9wbG90c19kZV9oaWdobGlnaHRbWzVdXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9wbG90c19kZV9oaWdobGlnaHRbWzZdXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9wbG90c19kZV9oaWdobGlnaHRbWzddXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9wbG90c19kZV9oaWdobGlnaHRbWzhdXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJvdyA9IDIpCgpjb21wb3NpdGVfY2VsbF9sb2NhdGlvbnMKYGBgCgpzYXZlCmBgYHtyfQpnZ3NhdmUoIi4uL2ltYWdlc190b19leHBvcnQvQUxMQ0VMTFNfZGVfY2VsbF9sb2NhdGlvbnMucG5nIiwgcGxvdCA9IGNvbXBvc2l0ZV9jZWxsX2xvY2F0aW9ucywgZGV2aWNlID0gInBuZyIsIHBhdGggPSBOVUxMLCBzY2FsZSA9IDEsIHdpZHRoID0gMjAsIGhlaWdodCA9IDEwLCB1bml0cyA9ICJjbSIsIGRwaSA9IDMwMCwgbGltaXRzaXplID0gVFJVRSkKYGBgCgpBc3Nlc3NpbmcgREUgZ2VuZXMKCmBgYHtyfQojIyBtYWtlIGEgbGlzdCBvZiBkYXRhZnJhbWVzIHNvIG9uZSBjYW4gcnVuIGZvciBsb29wcyBvbiB0aGVzZQpsaXN0X29mX0RFX2dlbmVfbGlzdHMgPC0gCmBgYAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKClJ1biB0U05FCmBgYHtyfQp0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleCA8LSBSdW5UU05FKHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4LCBzZWVkLnVzZSA9IDEyMzQsIHBlcnBsZXhpdHkgPSAyMDApCkRpbVBsb3QodGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXgsIHJlZHVjdGlvbiA9ICJ0c25lIiwgcHQuc2l6ZSA9IDAuMDEsIGxhYmVsID0gVFJVRSkKYGBgCgojIyBCLiBVTUFQCgpjYWxjdWxhdGUgVU1BUApgYGB7ciwgZmlnLmhlaWdodCA9IDcsIGZpZy53aWR0aCA9IDd9CiMjIHJ1biBVTUFQCiN0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleCA8LSBSdW5VTUFQKHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4LCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MTUsIG4ubmVpZ2hib3JzID0gMjAsIHNlZWQudXNlID0gMTIzNCwgbWluLmRpc3QgPSAwLjUsIHJlcHVsc2lvbi5zdHJlbmd0aCA9IDAuMDUsIHJlZHVjdGlvbi5uYW1lID0gInVtYXBvcHRpbWlzZWRfcG9zdF9yZXBjYSIpCgp0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleCA8LSBSdW5VTUFQKHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4LCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MTEsIHNlZWQudXNlID0gMTIzNCwgbi5uZWlnaGJvcnMgPSAxMCwgcmVkdWN0aW9uLm5hbWUgPSAidW1hcG9wdGltaXNlZF9wb3N0X3JlcGNhIiwgcmVkdWN0aW9uLmtleT0ndW1hcF9wb3N0X3JlcGNhXycpCgojIyBwbG90CkRpbVBsb3QodGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXgsIHJlZHVjdGlvbiA9ICJ1bWFwb3B0aW1pc2VkX3Bvc3RfcmVwY2EiLCBsYWJlbCA9IFRSVUUsIHJlcGVsID0gVFJVRSwgbGFiZWwuc2l6ZSA9IDUsIHB0LnNpemUgPSAwLjUsIGdyb3VwLmJ5ID0gImlkZW50aXR5X2NvbWJpbmVkIikgKwogIGNvb3JkX2ZpeGVkKCkgKwogIHRoZW1lX3ZvaWQoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsKICBndWlkZXMoY29sb3VyPWd1aWRlX2xlZ2VuZChucm93PTMsYnlyb3c9VFJVRSwgb3ZlcnJpZGUuYWVzID0gbGlzdChzaXplPTQpKSkKCkRpbVBsb3QodGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXgsIHJlZHVjdGlvbiA9ICJ1bWFwb3B0aW1pc2VkX3Bvc3RfcmVwY2EiLCBsYWJlbCA9IFRSVUUsIHJlcGVsID0gVFJVRSwgbGFiZWwuc2l6ZSA9IDUsIHB0LnNpemUgPSAwLjUsIHNwbGl0LmJ5ID0gImdlbm90eXBlX2NvbWJpbmVkIikgKwogIGNvb3JkX2ZpeGVkKCkgKwogIHRoZW1lX3ZvaWQoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsKICBndWlkZXMoY29sb3VyPWd1aWRlX2xlZ2VuZChucm93PTMsYnlyb3c9VFJVRSwgb3ZlcnJpZGUuYWVzID0gbGlzdChzaXplPTQpKSkKCkRpbVBsb3QodGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXgsIHJlZHVjdGlvbiA9ICJ1bWFwb3B0aW1pc2VkX3Bvc3RfcmVwY2EiLCBsYWJlbCA9IFRSVUUsIHJlcGVsID0gVFJVRSwgbGFiZWwuc2l6ZSA9IDUsIHB0LnNpemUgPSAwLjUsIHNwbGl0LmJ5ID0gImV4cGVyaW1lbnQiLCBncm91cC5ieSA9ICJpZGVudGl0eV9jb21iaW5lZCIpICsKICBjb29yZF9maXhlZCgpICsKICB0aGVtZV92b2lkKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArCiAgZ3VpZGVzKGNvbG91cj1ndWlkZV9sZWdlbmQobnJvdz0zLGJ5cm93PVRSVUUsIG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZT00KSkpCgpGZWF0dXJlUGxvdCh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleCwgcmVkdWN0aW9uID0gInVtYXBvcHRpbWlzZWRfcG9zdF9yZXBjYSIsIHB0LnNpemUgPSAwLjAxLCBmZWF0dXJlcyA9ICJQQkFOS0EtMTMxOTUwMCIpICsgY29vcmRfZml4ZWQoKQpgYGAKCgpjaGVjayBtYXJrZXJzIHRvIG9yaWVudGF0ZQpgYGB7ciwgZmlnLmhlaWdodCA9IDQsIGZpZy53aWR0aCA9IDEwfQpwbG90cyA8LSBGZWF0dXJlUGxvdCh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleCwgZmVhdHVyZXMgPSBjKCJQQkFOS0EtMTMxOTUwMCIsICJQQkFOS0EtMDQxNjEwMCIpLCBibGVuZCA9IFRSVUUsIGNvbWJpbmUgPSBGQUxTRSwgY29vcmQuZml4ZWQgPSBUUlVFLCByZWR1Y3Rpb24gPSAidW1hcG9wdGltaXNlZF9wb3N0X3JlcGNhIikKCnBsb3RzW1szXV0gKyBOb0xlZ2VuZCgpICAjIEdldCBqdXN0IHRoZSBjby1leHByZXNzaW9uIHBsb3QsIGJ1aWx0LWluIGxlZ2VuZCBpcyBtZWFuaW5nbGVzcyBmb3IgdGhpcyBwbG90CnBsb3RzW1s0XV0gIyBHZXQganVzdCB0aGUga2V5CkNvbWJpbmVQbG90cyhwbG90c1szOjRdLCBsZWdlbmQgPSAnbm9uZScsIG5jb2wgPTIsIG5yb3cgPSAxLCByZWxfd2lkdGhzID0gYygyLCAxKSwgcmVsX2hlaWdodHMgPSBjKDQsMSkpICMgU3RpdGNoIHRoZSBjby1leHByZXNzaW9uIGFuZCBrZXkgcGxvdHMgdG9nZXRoZXIKYGBgCgppbnNwZWN0IG11dGFudHMgaW4gMTMgdGhhdCBhcmUgaW4gYmV0d2VlbiBzZXhlcwpgYGB7cn0KIyMgZ2V0IG11dGFudCBjZWxscwptdXRhbnRfc2V4X2NlbGxzIDwtIHJvd25hbWVzKHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YVt3aGljaCh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGEkZ2Vub3R5cGVfY29tYmluZWQgPT0gIk11dGFudCIpLF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiMjIHN1YnNldCBvYmplY3QKbXV0YW50X29ubHlfc2V1cmF0IDwtIHN1YnNldCh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleCwgY2VsbHMgPSBtdXRhbnRfc2V4X2NlbGxzKQoKIyMgcGxvdAp1bWFwX211dGFudCA8LSBEaW1QbG90KG11dGFudF9vbmx5X3NldXJhdCwgcmVkdWN0aW9uID0gInVtYXBvcHRpbWlzZWRfcG9zdF9yZXBjYSIsIGxhYmVsID0gVFJVRSwgcmVwZWwgPSBUUlVFLCBsYWJlbC5zaXplID0gNSwgcHQuc2l6ZSA9IDAuNSkgKwogIGNvb3JkX2ZpeGVkKCkgKwogIHRoZW1lX3ZvaWQoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsKICBndWlkZXMoY29sb3VyPWd1aWRlX2xlZ2VuZChucm93PTMsYnlyb3c9VFJVRSwgb3ZlcnJpZGUuYWVzID0gbGlzdChzaXplPTQpKSkKCiMjIHZpZXcKSG92ZXJMb2NhdG9yKHBsb3QgPSB1bWFwX211dGFudCwgaW5mb3JtYXRpb24gPSBGZXRjaERhdGEobXV0YW50X29ubHlfc2V1cmF0LCB2YXJzID0gYygiaWRlbnQiLCAiaWRlbnRpdHlfdXBkYXRlZCIsICJuRmVhdHVyZV9STkEiLCAiaWRlbnRpdHlfY29tYmluZWQiKSkpCmBgYAoKYGBge3J9CkRpbVBsb3QobXV0YW50X29ubHlfc2V1cmF0LCBsYWJlbCA9IFRSVUUsIGxhYmVsLnNpemUgPSA4LCByZXBlbCA9IEZBTFNFLCBwdC5zaXplID0gMC41LCBkaW1zID0gYygyLDEpLCByZWR1Y3Rpb24gPSAiRElNX1VNQVAiKSArIAogICAgIGNvb3JkX2ZpeGVkKCkgKwogICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIiwgCiAgICAgICAgICAgYXhpcy5saW5lPWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgIGF4aXMudGlja3M9ZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgIGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgYXhpcy50aXRsZS55PWVsZW1lbnRfYmxhbmsoKSkgKyAKICAgICBndWlkZXMoY29sb3VyPWd1aWRlX2xlZ2VuZChucm93ID0gMywgYnlyb3cgPSBUUlVFLCBvdmVycmlkZS5hZXMgPSBsaXN0KHNpemU9NSkpKQpgYGAKCiMgNC4gQ2x1c3RlcmluZyB7LnRhYnNldH0KCiMjIyBJbnZlc3RpZ2F0ZSBzdWIgY2x1c3RlcmluZyBvZiBwcmUtYnJhbmNoIGNsdXN0ZXJzCgpVbHRpbWF0ZWx5LCB3ZSBhcmUgbG9va2luZyBmb3IgY29leHByZXNzaW9uIGFmdGVyIHRoZSBleHByZXNzaW9uIG9mIEFQMkc6CmBgYHtyfQojIyBwbG90Cm1hcmtlcl9nZW5lX3Bsb3RfQVAyRyA8LSBGZWF0dXJlUGxvdCh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleCwgZmVhdHVyZXMgPSAiUEJBTktBLTE0Mzc1MDAiLCBjb29yZC5maXhlZCA9IFRSVUUsIG1pbi5jdXRvZmYgPSAicTEiLCBkaW1zID0gYygyLDEpLCByZWR1Y3Rpb24gPSAiRElNX1VNQVAiLCBwdC5zaXplID0gMSwgb3JkZXIgPSBUUlVFKSArIAogIHRoZW1lX3ZvaWQoKSArIAogIGxhYnModGl0bGUgPSBwYXN0ZSgiQVAyRyBFeHByZXNzaW9uIikpICsgCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgZmFtaWx5PSJBcmlhbCIsIHNpemUgPSAyMCwgZmFjZSA9ICJib2xkIikpICsgCiAgc2NhbGVfY29sb3VyX2dyYWRpZW50bihjb2xvdXJzPWMoIiNEQ0RDREMiLCBwbGFzbWEoMzApKSkKCiMjdmlldwptYXJrZXJfZ2VuZV9wbG90X0FQMkcKYGBgCmFuZCB3ZSBoYXZlIHRoZSBmb2xsb3dpbmcgY2x1c3RlcnMgY3VycmVudGx5OgoKYGBge3IsIGZpZy5oZWlnaHQgPSA0LCBmaWcud2lkdGggPSA0fQojIyBQbG90CnVtYXBfY2x1c3RlciA8LSBEaW1QbG90KHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4LCBsYWJlbCA9IFRSVUUsIGxhYmVsLnNpemUgPSA4LCByZXBlbCA9IEZBTFNFLCBwdC5zaXplID0gMC41LCBkaW1zID0gYygyLDEpLCByZWR1Y3Rpb24gPSAiRElNX1VNQVAiKSArIAogIGNvb3JkX2ZpeGVkKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIiwgCiAgICAgICAgYXhpcy5saW5lPWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3M9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS55PWVsZW1lbnRfYmxhbmsoKSkgKyAKICBndWlkZXMoY29sb3VyPWd1aWRlX2xlZ2VuZChucm93ID0gMywgYnlyb3cgPSBUUlVFLCBvdmVycmlkZS5hZXMgPSBsaXN0KHNpemU9NSkpKQoKIyMgcHJpbnQKdW1hcF9jbHVzdGVyCmBgYAoKMTEgaXMgdGhlIGNvbW1vbiBzZXggYnJhbmNoIHNvIHdlIHdpbGwgaW50ZXJyb2dhdGUgdGhhdCBicmFuY2gKCmBgYHtyfQojIyBzdWJzZXQgY2x1c3RlciAxMyBjZWxscwpjZWxsc19iaXBvdCA8LSByb3duYW1lcyh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGFbdGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXhAbWV0YS5kYXRhJHNldXJhdF9jbHVzdGVycyA9PSAxMSAmIHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YSRnZW5vdHlwZV9jb21iaW5lZCA9PSAiV1QiLCBdKQoKIyMgc3Vic2V0IGNsdXN0ZXIgMTMKc2V1cmF0X2JpcG90IDwtIHN1YnNldCh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleCwgY2VsbHMgPSBjZWxsc19iaXBvdCkKc2V1cmF0X2JpcG90CgojIyByZS1QQ0EKc2V1cmF0X2JpcG90IDwtIFJ1blBDQShzZXVyYXRfYmlwb3QsIG5wY3MgPSAzMCwgdmVyYm9zZSA9IEZBTFNFKQpFbGJvd1Bsb3Qoc2V1cmF0X2JpcG90LCBuZGltcyA9IDMwLCByZWR1Y3Rpb24gPSAicGNhIikKCiMjIHJlY2x1c3RlcgpzZXVyYXRfYmlwb3QgPC0gRmluZE5laWdoYm9ycyhzZXVyYXRfYmlwb3QsIGRpbXMgPSAxOjE1KQpzZXVyYXRfYmlwb3QgPC0gRmluZENsdXN0ZXJzKHNldXJhdF9iaXBvdCwgcmVzb2x1dGlvbiA9IDEsIHJhbmRvbS5zZWVkID0gNDIsIGFsZ29yaXRobSA9IDIpCkRpbVBsb3Qoc2V1cmF0X2JpcG90LCByZWR1Y3Rpb24gPSAicGNhIiwgIGRpbXMgPSBjKDIsMSksIGxhYmVsID0gVFJVRSwgcmVwZWwgPSBUUlVFLCBsYWJlbC5zaXplID0gNSwgcHQuc2l6ZSA9IDAuNSwgZ3JvdXAuYnkgPSAic2V1cmF0X2NsdXN0ZXJzIikgCgojIyBwbG90IGNsdXN0ZXIgcmVzb2x1dGlvbiA9IDEKIyMgcGxvdApEaW1QbG90KHNldXJhdF9iaXBvdCwgcmVkdWN0aW9uID0gIkRJTV9VTUFQIiwgIGRpbXMgPSBjKDIsMSksIGxhYmVsID0gVFJVRSwgcmVwZWwgPSBUUlVFLCBsYWJlbC5zaXplID0gNSwgcHQuc2l6ZSA9IDAuNSwgZ3JvdXAuYnkgPSAic2V1cmF0X2NsdXN0ZXJzIikgKwogIGNvb3JkX2ZpeGVkKCkgKwogIHRoZW1lX3ZvaWQoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsKICBndWlkZXMoY29sb3VyPWd1aWRlX2xlZ2VuZChucm93PTMsYnlyb3c9VFJVRSwgb3ZlcnJpZGUuYWVzID0gbGlzdChzaXplPTQpKSkKYGBgCgoyIGFuZCAxIGFyZSBzdXBlcmltcG9zZWQgb24gdGhlIGJyYW5jaCwgbGV0cyBmaW5kIG1hcmtlcnMgZm9yIGVhY2ggY2x1c3RlcgoKYGBge3J9CgojIFBCQU5LQS0wODI4MDAwICAgICAgICAgR0NTS08tMyAgR0QxCgojIFBCQU5LQS0xMzAyNzAwICAgICAgIEdDU0tPLW9vbSAgTUQxIAojIFBCQU5LQS0xNDQ3OTAwICAgICAgICBHQ1NLTy0yOSAgTUQyCiMgUEJBTktBLTAxMDI0MDAgICAgICAgICBHQ1NLTy0yICBNRDMgCiMgUEJBTktBLTA3MTY1MDAgICAgICAgIEdDU0tPLTE5ICBNRDQgCiMgUEJBTktBLTA0MTM0MDAgICAgR0NTS08tMTBfODIwICBNRDUKCiMgUEJBTktBLTE0NTQ4MDAgICAgICAgIEdDU0tPLTIxICBGRDEKIyBQQkFOS0EtMDkwMjMwMCAgICAgICAgR0NTS08tMTMgIEZEMgojIFBCQU5LQS0xNDE4MTAwICAgICAgICBHQ1NLTy0xNyAgRkQzICAgCiMgUEJBTktBLTE0MzUyMDAgICAgICAgIEdDU0tPLTIwICBGRDQgCgojIFBCQU5LQS0xNDM3NTAwIC0gQVAyRyAtIGNvbW1pdG1lbnQKCiMjIGZpbmQgbWFya2VycwpzZXVyYXRfYmlwb3RfbWFya2VycyA8LSBGaW5kQWxsTWFya2VycyhzZXVyYXRfYmlwb3QsIG9ubHkucG9zID0gRkFMU0UsIG1pbi5wY3QgPSAwLjI1LCBsb2dmYy50aHJlc2hvbGQgPSAwLjI1LCB0ZXN0LnVzZSA9ICJNQVNUIikKCiMjIGluc3BlY3QgcmVzdWx0Cm1hcmtlcnNfc3Vic2V0IDwtIHNldXJhdF9iaXBvdF9tYXJrZXJzICU+JSBncm91cF9ieShjbHVzdGVyKSAlPiUgdG9wX24obiA9IDUwLCB3dCA9IGF2Z19sb2dGQykgJT4lIGZpbHRlcihwX3ZhbF9hZGogPCAwLjA1KQptYXJrZXJzX3N1YnNldCA8LSBtYXJrZXJzX3N1YnNldFtvcmRlcigtbWFya2Vyc19zdWJzZXQkYXZnX2xvZ0ZDKSwgXQptYXJrZXJzX3N1YnNldAoKIyMgZmluZCBtYXJrZXJzCm1hcmtlcnNfc3Vic2V0X211dGFudCA8LSBtYXJrZXJzX3N1YnNldFt3aGljaChtYXJrZXJzX3N1YnNldCRnZW5lICVpbiUgbGlzdF9vZl9tdXRhbnRfZ2VuZXMpLCBdCm1hcmtlcnNfc3Vic2V0X211dGFudAoKIyMgcGxvdApWbG5QbG90KHNldXJhdF9iaXBvdCwgZmVhdHVyZXMgPSBjKG1hcmtlcnNfc3Vic2V0X211dGFudCRnZW5lLCAiUEJBTktBLTE0Mzc1MDAiKSwgYXNzYXkgPSAiUk5BIikKYGBgClNwZWNpZmljYWxseSBsb29rIGZvciBtYXJrZXJzIGJldHdlZW4gMCBhbmQgMgpgYGB7cn0KY2x1c3Rlcl8xXzJfbWFya2VycyA8LSBGaW5kTWFya2VycyhzZXVyYXRfYmlwb3QsIGlkZW50LjEgPSAwLCBpZGVudC4yID0gMiwgb25seS5wb3MgPSBGQUxTRSwgbWluLnBjdCA9IDAuMjUsIGxvZ2ZjLnRocmVzaG9sZCA9IDAuMjUpCgpjbHVzdGVyXzFfMl9tYXJrZXJzX3N1YnNldCA8LSBjbHVzdGVyXzFfMl9tYXJrZXJzICU+JSBmaWx0ZXIocF92YWxfYWRqIDwgMC4wNSkKY2x1c3Rlcl8xXzJfbWFya2Vyc19zdWJzZXQgPC0gY2x1c3Rlcl8xXzJfbWFya2Vyc19zdWJzZXRbb3JkZXIoLWNsdXN0ZXJfMV8yX21hcmtlcnNfc3Vic2V0JGF2Z19sb2dGQyksIF0KY2x1c3Rlcl8xXzJfbWFya2Vyc19zdWJzZXQKYGBgCgpgYGB7cn0KIyMgdGhpcyBpcyBubyBsb25nZXIgbmVlZGVkIGFzIG9ubHkgd2lsZC10eXBlIGNlbGxzIGFyZSBjaG9zZW4uCiMjIEp1c3QgY2hlY2sgdGhhdCBtdXRhbnRzIGFyZW4ndCBpbnRlcmZlcmluZyAgd2l0aCB0aGUgYW5hbHlzaXMgaS5lLiB0aGUgY2x1c3RlcnMgZG9uJ3QganVzdCBiZWxvbmcgdG8gYSBjZXJ0YWluIGdlbm90eXBlIG9yIG11dGFudCBjZWxsCiN0YWJsZShzZXVyYXRfYmlwb3Qkc2V1cmF0X2NsdXN0ZXJzLCBzZXVyYXRfYmlwb3QkaWRlbnRpdHlfY29tYmluZWQpCmBgYAoKRG8gdGhlIHNhbWUgYW5hbHlzaXMgb24gY2x1c3RlciA1IHF1aWNrbHkKYGBge3J9CiMjIHN1YnNldCBjbHVzdGVyIDEzIGNlbGxzCmNlbGxzX3RocmVlIDwtIHJvd25hbWVzKHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YVt0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGEkc2V1cmF0X2NsdXN0ZXJzID09IDUsIF0pCgojIyBzdWJzZXQgY2x1c3RlciAxMwpjZWxsc190aHJlZSA8LSBzdWJzZXQodGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXgsIGNlbGxzID0gY2VsbHNfdGhyZWUpCgojIyByZS1QQ0EKY2VsbHNfdGhyZWUgPC0gUnVuUENBKGNlbGxzX3RocmVlLCBucGNzID0gMzAsIHZlcmJvc2UgPSBGQUxTRSkKRWxib3dQbG90KGNlbGxzX3RocmVlLCBuZGltcyA9IDMwLCByZWR1Y3Rpb24gPSAicGNhIikKCiMjIHJlY2x1c3RlcgpjZWxsc190aHJlZSA8LSBGaW5kTmVpZ2hib3JzKGNlbGxzX3RocmVlLCBkaW1zID0gMTo1KQojIyBmaXJzdCBkbyBhIGMoMC41LDEsMikgZm9yIHJlc29sdXRpb24gYW5kIHRoZW4gcGljayBhIHNlbnNpYmxlIGNsdXN0ZXIgbnVtYmVyCmNlbGxzX3RocmVlIDwtIEZpbmRDbHVzdGVycyhjZWxsc190aHJlZSwgcmVzb2x1dGlvbiA9IDAuNSwgcmFuZG9tLnNlZWQgPSA0MiwgYWxnb3JpdGhtID0gMikKRGltUGxvdChjZWxsc190aHJlZSwgcmVkdWN0aW9uID0gInBjYSIsICBkaW1zID0gYygyLDEpLCBsYWJlbCA9IFRSVUUsIHJlcGVsID0gVFJVRSwgbGFiZWwuc2l6ZSA9IDUsIHB0LnNpemUgPSAwLjUsIGdyb3VwLmJ5ID0gInNldXJhdF9jbHVzdGVycyIpIAoKIyMgcGxvdCBjbHVzdGVyIHJlc29sdXRpb24gPSAxCiMjIHBsb3QKRGltUGxvdChjZWxsc190aHJlZSwgcmVkdWN0aW9uID0gIkRJTV9VTUFQIiwgIGRpbXMgPSBjKDIsMSksIGxhYmVsID0gVFJVRSwgcmVwZWwgPSBUUlVFLCBsYWJlbC5zaXplID0gNSwgcHQuc2l6ZSA9IDAuNSwgZ3JvdXAuYnkgPSAic2V1cmF0X2NsdXN0ZXJzIikgKwogIGNvb3JkX2ZpeGVkKCkgKwogIHRoZW1lX3ZvaWQoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsKICBndWlkZXMoY29sb3VyPWd1aWRlX2xlZ2VuZChucm93PTMsYnlyb3c9VFJVRSwgb3ZlcnJpZGUuYWVzID0gbGlzdChzaXplPTQpKSkKYGBgCgpgYGB7cn0KIyBQQkFOS0EtMDgyODAwMCAgICAgICAgIEdDU0tPLTMgIEdEMQoKIyBQQkFOS0EtMTMwMjcwMCAgICAgICBHQ1NLTy1vb20gIE1EMSAKIyBQQkFOS0EtMTQ0NzkwMCAgICAgICAgR0NTS08tMjkgIE1EMgojIFBCQU5LQS0wMTAyNDAwICAgICAgICAgR0NTS08tMiAgTUQzIAojIFBCQU5LQS0wNzE2NTAwICAgICAgICBHQ1NLTy0xOSAgTUQ0IAojIFBCQU5LQS0wNDEzNDAwICAgIEdDU0tPLTEwXzgyMCAgTUQ1CgojIFBCQU5LQS0xNDU0ODAwICAgICAgICBHQ1NLTy0yMSAgRkQxCiMgUEJBTktBLTA5MDIzMDAgICAgICAgIEdDU0tPLTEzICBGRDIKIyBQQkFOS0EtMTQxODEwMCAgICAgICAgR0NTS08tMTcgIEZEMyAgIAojIFBCQU5LQS0xNDM1MjAwICAgICAgICBHQ1NLTy0yMCAgRkQ0IAoKIyBQQkFOS0EtMTQzNzUwMCAtIEFQMkcgLSBjb21taXRtZW50CgojIyBmaW5kIG1hcmtlcnMKY2VsbHNfdGhyZWVfbWFya2VycyA8LSBGaW5kQWxsTWFya2VycyhjZWxsc190aHJlZSwgb25seS5wb3MgPSBGQUxTRSwgbWluLnBjdCA9IDAuMjUsIGxvZ2ZjLnRocmVzaG9sZCA9IDAuMjUpCgojIyBpbnNwZWN0IHJlc3VsdAptYXJrZXJzX3N1YnNldCA8LSBjZWxsc190aHJlZV9tYXJrZXJzICU+JSBncm91cF9ieShjbHVzdGVyKSAlPiUgdG9wX24obiA9IDUwLCB3dCA9IGF2Z19sb2dGQykgJT4lIGZpbHRlcihwX3ZhbF9hZGogPCAwLjA1KQptYXJrZXJzX3N1YnNldCA8LSBtYXJrZXJzX3N1YnNldFtvcmRlcigtbWFya2Vyc19zdWJzZXQkYXZnX2xvZ0ZDKSwgXQptYXJrZXJzX3N1YnNldAoKIyMgZmluZCBtYXJrZXJzCm1hcmtlcnNfc3Vic2V0X211dGFudCA8LSBtYXJrZXJzX3N1YnNldFt3aGljaChtYXJrZXJzX3N1YnNldCRnZW5lICVpbiUgbGlzdF9vZl9tdXRhbnRfZ2VuZXMpLCBdCm1hcmtlcnNfc3Vic2V0X211dGFudAoKIyMgcGxvdApWbG5QbG90KGNlbGxzX3RocmVlLCBmZWF0dXJlcyA9IGMobWFya2Vyc19zdWJzZXRfbXV0YW50JGdlbmUsICJQQkFOS0EtMTQzNzUwMCIpLCBhc3NheSA9ICJSTkEiKQpgYGAKCmBgYHtyfQptYXJrZXJzX3N1YnNldF9hbm5vdGF0ZWQgPC0gbWVyZ2UobWFya2Vyc19zdWJzZXQsIGdlbmVfYW5ub3RhdGlvbnMsICBieS54ID0gImdlbmUiLCBieS55ID0gIkdlbmUuSUQiLCBhbGwgPSBGQUxTRSkKbWFya2Vyc19zdWJzZXRfYW5ub3RhdGVkCmBgYAoKCkNsdXN0ZXIgMiBjb250YWlucyB0aGUgbWFsZSBjZWxscyBhcyB0aGlzIGhhcyBtZDEgYW5kIGFwMmcgaW4gaXQuIAoKY2x1c3RlciAzIGhhcyBoaXN0b25lIGgyYiwgaGlzdG9uZSA0LCBhY3RpbiAxLCBzbyBsaWtsZXkgY29udGFpbnMgYXNleHVhbCBjZWxscwoKY2x1c3RlciAwIGlzIHBvdGVudGlhbGx5IGZlbWFsZSBhcyB0aGVzZSBnZW5lcyBoYXZlIGZlbWFsZS1iaWFzZWQgZXhwcmVzc2lvbiBpbiB0aGUga2FzaWEgZGF0YQoKY2x1c3RlciAxIGdlbmVzIHdlcmUgbm90IHNjcmVlbmVkIHNvIHVua25vd24gaWRlbnRpdHkKClRoZW4gbG9vayBhdCB0aGUgY28tZXhwcmVzc2lvbiBvZiBBUDItRyBhbmQgTUQxCmBgYHtyfQpjbHVzdGVyXzJfY2VsbHMgPC0gcm93bmFtZXMoY2VsbHNfdGhyZWVAbWV0YS5kYXRhW2NlbGxzX3RocmVlQG1ldGEuZGF0YSRzZXVyYXRfY2x1c3RlcnMgPT0gIjIiLF0pCmNlbGxzX3RocmVlXzIgPC0gc3Vic2V0KGNlbGxzX3RocmVlLCBjZWxscyA9IGNsdXN0ZXJfMl9jZWxscykKCmRmX3Bsb3QgPC0gZGF0YS5mcmFtZSh0KGRhdGEuZnJhbWUoY2VsbHNfdGhyZWVfMkBhc3NheXMkUk5BW2MoIlBCQU5LQS0xMzAyNzAwIiwgIlBCQU5LQS0xNDM3NTAwIiksIF0pKSkKCmdncGxvdChkZl9wbG90LCBhZXMoUEJBTktBLjEzMDI3MDAsIFBCQU5LQS4xNDM3NTAwKSkgKyBnZW9tX3BvaW50KCkKCnJtKGNlbGxzX3RocmVlXzIpCmBgYAoKRG8gdGhlIHNhbWUgb24gY2x1c3RlciA3IAoKYGBge3J9CiMjIHN1YnNldCBjbHVzdGVyIDEzIGNlbGxzCmNlbGxzX3NldmVuIDwtIHJvd25hbWVzKHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YVt0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGEkc2V1cmF0X2NsdXN0ZXJzID09IDcgJiB0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGEkZ2Vub3R5cGVfY29tYmluZWQgPT0gIldUIiwgXSkKCiMjIHN1YnNldCBjbHVzdGVyIDEzCmNlbGxzX3NldmVuIDwtIHN1YnNldCh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleCwgY2VsbHMgPSBjZWxsc19iaXBvdCkKY2VsbHNfc2V2ZW4KCiMjIHJlLVBDQQpjZWxsc19zZXZlbiA8LSBSdW5QQ0EoY2VsbHNfc2V2ZW4sIG5wY3MgPSAzMCwgdmVyYm9zZSA9IEZBTFNFKQpFbGJvd1Bsb3QoY2VsbHNfc2V2ZW4sIG5kaW1zID0gMzAsIHJlZHVjdGlvbiA9ICJwY2EiKQoKIyMgcmVjbHVzdGVyCmNlbGxzX3NldmVuIDwtIEZpbmROZWlnaGJvcnMoY2VsbHNfc2V2ZW4sIGRpbXMgPSAxOjE1KQpjZWxsc19zZXZlbiA8LSBGaW5kQ2x1c3RlcnMoY2VsbHNfc2V2ZW4sIHJlc29sdXRpb24gPSAxLCByYW5kb20uc2VlZCA9IDQyLCBhbGdvcml0aG0gPSAyKQpEaW1QbG90KGNlbGxzX3NldmVuLCByZWR1Y3Rpb24gPSAicGNhIiwgIGRpbXMgPSBjKDIsMSksIGxhYmVsID0gVFJVRSwgcmVwZWwgPSBUUlVFLCBsYWJlbC5zaXplID0gNSwgcHQuc2l6ZSA9IDAuNSwgZ3JvdXAuYnkgPSAic2V1cmF0X2NsdXN0ZXJzIikgCgojIyBwbG90IGNsdXN0ZXIgcmVzb2x1dGlvbiA9IDEKIyMgcGxvdApEaW1QbG90KGNlbGxzX3NldmVuLCByZWR1Y3Rpb24gPSAiRElNX1VNQVAiLCAgZGltcyA9IGMoMiwxKSwgbGFiZWwgPSBUUlVFLCByZXBlbCA9IFRSVUUsIGxhYmVsLnNpemUgPSA1LCBwdC5zaXplID0gMC41LCBncm91cC5ieSA9ICJzZXVyYXRfY2x1c3RlcnMiKSArCiAgY29vcmRfZml4ZWQoKSArCiAgdGhlbWVfdm9pZCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogIGd1aWRlcyhjb2xvdXI9Z3VpZGVfbGVnZW5kKG5yb3c9MyxieXJvdz1UUlVFLCBvdmVycmlkZS5hZXMgPSBsaXN0KHNpemU9NCkpKQpgYGAKYGBge3J9CiMgUEJBTktBLTA4MjgwMDAgICAgICAgICBHQ1NLTy0zICBHRDEKCiMgUEJBTktBLTEzMDI3MDAgICAgICAgR0NTS08tb29tICBNRDEgCiMgUEJBTktBLTE0NDc5MDAgICAgICAgIEdDU0tPLTI5ICBNRDIKIyBQQkFOS0EtMDEwMjQwMCAgICAgICAgIEdDU0tPLTIgIE1EMyAKIyBQQkFOS0EtMDcxNjUwMCAgICAgICAgR0NTS08tMTkgIE1ENCAKIyBQQkFOS0EtMDQxMzQwMCAgICBHQ1NLTy0xMF84MjAgIE1ENQoKIyBQQkFOS0EtMTQ1NDgwMCAgICAgICAgR0NTS08tMjEgIEZEMQojIFBCQU5LQS0wOTAyMzAwICAgICAgICBHQ1NLTy0xMyAgRkQyCiMgUEJBTktBLTE0MTgxMDAgICAgICAgIEdDU0tPLTE3ICBGRDMgICAKIyBQQkFOS0EtMTQzNTIwMCAgICAgICAgR0NTS08tMjAgIEZENCAKCiMgUEJBTktBLTE0Mzc1MDAgLSBBUDJHIC0gY29tbWl0bWVudAoKIyMgZmluZCBtYXJrZXJzCmNlbGxzX3NldmVuX21hcmtlcnMgPC0gRmluZEFsbE1hcmtlcnMoY2VsbHNfc2V2ZW4sIG9ubHkucG9zID0gRkFMU0UsIG1pbi5wY3QgPSAwLjI1LCBsb2dmYy50aHJlc2hvbGQgPSAwLjI1KQoKIyMgaW5zcGVjdCByZXN1bHQKbWFya2Vyc19zdWJzZXQgPC0gY2VsbHNfc2V2ZW5fbWFya2VycyAlPiUgZ3JvdXBfYnkoY2x1c3RlcikgJT4lIHRvcF9uKG4gPSA1MCwgd3QgPSBhdmdfbG9nRkMpICU+JSBmaWx0ZXIocF92YWxfYWRqIDwgMC4wNSkKbWFya2Vyc19zdWJzZXQgPC0gbWFya2Vyc19zdWJzZXRbb3JkZXIoLW1hcmtlcnNfc3Vic2V0JGF2Z19sb2dGQyksIF0KbWFya2Vyc19zdWJzZXQKCiMjIGZpbmQgbWFya2VycwptYXJrZXJzX3N1YnNldF9tdXRhbnQgPC0gbWFya2Vyc19zdWJzZXRbd2hpY2gobWFya2Vyc19zdWJzZXQkZ2VuZSAlaW4lIGxpc3Rfb2ZfbXV0YW50X2dlbmVzKSwgXQptYXJrZXJzX3N1YnNldF9tdXRhbnQKCiMjIHBsb3QKI1ZsblBsb3QoY2VsbHNfc2V2ZW4sIGZlYXR1cmVzID0gYyhtYXJrZXJzX3N1YnNldF9tdXRhbnQkZ2VuZSwgIlBCQU5LQS0xNDM3NTAwIiksIGFzc2F5ID0gIlJOQSIpCmBgYAoKYGBge3J9CiMgaWYgKCFyZXF1aXJlTmFtZXNwYWNlKCJCaW9jTWFuYWdlciIsIHF1aWV0bHkgPSBUUlVFKSkKIyAgICAgaW5zdGFsbC5wYWNrYWdlcygiQmlvY01hbmFnZXIiKQojIAojIEJpb2NNYW5hZ2VyOjppbnN0YWxsKCJzbGluZ3Nob3QiKQpsaWJyYXJ5KHNsaW5nc2hvdCkKbGlicmFyeShSQ29sb3JCcmV3ZXIpCgojIyBleHRyYWN0cyBvbmx5IDEweCBjZWxscyAKd3RfY2VsbHMgPC0gcm93bmFtZXModGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXhAbWV0YS5kYXRhW3doaWNoKHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YSRpZGVudGl0eV9jb21iaW5lZCA9PSAiV1RfMTBYIiksXSkKd3RfY2VsbHMgPC0gcm93bmFtZXModGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXhAbWV0YS5kYXRhW3doaWNoKHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YSRpZGVudGl0eV9jb21iaW5lZCA9PSAiV1RfMTBYIiAmICF0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGEkc2V1cmF0X2NsdXN0ZXJzID09ICI3IiksXSkKCgojIyBtYWtlIGEgbmV3IFNldXJhdCBvZiB0aGlzCnNldXJhdC5vYmplY3QgPC1zdWJzZXQodGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXgsIGNlbGxzID0gd3RfY2VsbHMpCgojIyBnZXQgVU1BUCBjb29yZGluYXRlcwp1bWFwX2Nvb3JkcyA8LSBzZXVyYXQub2JqZWN0QHJlZHVjdGlvbnNbWyJESU1fVU1BUCJdXUBjZWxsLmVtYmVkZGluZ3MKIyMgb2xkIGNvZGU6IHNldXJhdC5vYmplY3RAcmVkdWN0aW9ucyR1bWFwb3B0aW1pc2VkX3Bvc3RfcmVwY2FAY2VsbC5lbWJlZGRpbmdzCiMjIG5ldyBjb2RlOiBzZXVyYXQub2JqZWN0QHJlZHVjdGlvbnNbWyJESU1fVU1BUCJdXUBjZWxsLmVtYmVkZGluZ3MKCiMjIGdldCBjbHVzdGVycwojY2x1c3RlcnMgPC0gYXMubGlzdChzZXVyYXQub2JqZWN0QG1ldGEuZGF0YSRpbnRlZ3JhdGVkX3Nubl9yZXMuNCkKI25hbWVzKGNsdXN0ZXJzKSA8LSByb3duYW1lcyhzZXVyYXQub2JqZWN0QG1ldGEuZGF0YSkKI2NsdXN0ZXJzIDwtIGFzLmxpc3QoY2x1c3RlcnMpCiMjIGNsdXN0ZXIgdXNpbmcga21lYW5zCiMjIHlvdSBuZWVkIHRvIHNldCBhIHNlZWQgaGVyZSB0byBlbnN1cmUgdGhlIHJlc3VsdHMgYXJlIHJlcHJvZHVjaWJsZQpzZXQuc2VlZCg0MikKY2x1c3RlcnMgPC0ga21lYW5zKHVtYXBfY29vcmRzLCBjZW50ZXJzID0gMTMpJGNsdXN0ZXIKCiMjIHBsb3QKIyMgbWFrZSBhIG5pY2VyIHBsb3Qgc28gd2UgY2FuIGludGVycHJldCB0aGUgY2x1c3RlcnMKZGZfcGxvdHRpbmcgPC0gYXMuZGF0YS5mcmFtZShjYmluZCh1bWFwX2Nvb3JkcywgY2x1c3RlcnMpKQojIyBjaGFuZ2UgdG8gY2hhcmFjdGVyIHRvIG1ha2UgaXQgZGlzY3JldGUKZGZfcGxvdHRpbmckY2x1c3RlcnMgPC0gYXMuY2hhcmFjdGVyKGRmX3Bsb3R0aW5nJGNsdXN0ZXJzKQojIyBwbG90CmdncGxvdChkZl9wbG90dGluZywgYWVzKHggPSBESU1VTUFQXzEsIHkgPSBESU1VTUFQXzIsIGNvbG91ciA9IGNsdXN0ZXJzKSkgKyAKICBnZW9tX3BvaW50KCkgKyAKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IHJhaW5ib3coMTUpKSArIAogIHRoZW1lX2NsYXNzaWMoKQoKCiMjIGluaXRpYWxpc2UgcGxvdCB0byBwcmV2ZW50IGVycm9yCnBsb3QubmV3KCkKCiMjIHNsaW5nc2hvdCB0byBnZXQgbGluZWFnZXMKbGluZWFnZV91YW1wIDwtIGdldExpbmVhZ2VzKHVtYXBfY29vcmRzLCBjbHVzdGVycywgc3RhcnQuY2x1cyA9ICc1JywgZW5kLmNsdXMgPSBjKCczJywgJzE2JykpCgojIyBtYWtlIGEgY3VydmUgdGhyb3VnaCBsaW5lYWdlIApjcnYxIDwtIGdldEN1cnZlcyhsaW5lYWdlX3VhbXApCgojIyBzZXQgdXAgdGhlIGNvbG91ciBwYWwKbmIuY29scyA8LSAxOCAKbXljb2xvcnMgPC0gY29sb3JSYW1wUGFsZXR0ZShicmV3ZXIucGFsKDksICJTZXQxIikpKG5iLmNvbHMpCgojIyBqb2luIHBvaW50cyB3aXRoIGxpbmUgc2VnbWVudHMgYW5kIHBsb3QKcGxvdCh1bWFwX2Nvb3JkcywgY29sID0gbXljb2xvcnNbY2x1c3RlcnNdLCBhc3AgPSAzLCBwY2ggPSAxNikKbGluZXMoY3J2MSwgbHdkID0gMywgY29sID0gJ2JsYWNrJykKYGBgClZpc3VhbGlzZSBjZWxsczoKYGBge3IsIGZpZy5oZWlnaHQgPSAxMCwgZmlnLndpZHRoID0gMTB9CiMjIGRlZmluZSBjZWxscwpzbGluZ3Nob3RfcmVzdWx0c19kZiA8LSBhcy5kYXRhLmZyYW1lKHNsaW5nUHNldWRvdGltZShjcnYxKSkKY3VydmVfb25lX2NlbGxzIDwtIHJvd25hbWVzKHNsaW5nc2hvdF9yZXN1bHRzX2RmWyFpcy5uYShzbGluZ3Nob3RfcmVzdWx0c19kZiRjdXJ2ZTEpLCBdKQpjdXJ2ZV90d29fY2VsbHMgPC0gcm93bmFtZXMoc2xpbmdzaG90X3Jlc3VsdHNfZGZbIWlzLm5hKHNsaW5nc2hvdF9yZXN1bHRzX2RmJGN1cnZlMiksIF0pCmN1cnZlX3RocmVlX2NlbGxzIDwtIHJvd25hbWVzKHNsaW5nc2hvdF9yZXN1bHRzX2RmWyFpcy5uYShzbGluZ3Nob3RfcmVzdWx0c19kZiRjdXJ2ZTMpLCBdKQpjdXJ2ZV9mb3VyX2NlbGxzIDwtIHJvd25hbWVzKHNsaW5nc2hvdF9yZXN1bHRzX2RmWyFpcy5uYShzbGluZ3Nob3RfcmVzdWx0c19kZiRjdXJ2ZTQpLCBdKQoKYzFfcGxvdCA8LSBEaW1QbG90KHNldXJhdC5vYmplY3QsIHJlcGVsID0gVFJVRSwgbGFiZWwuc2l6ZSA9IDUsIHB0LnNpemUgPSAwLjUsIGNlbGxzLmhpZ2hsaWdodCA9IGN1cnZlX29uZV9jZWxscywgZGltcyA9IGMoMiwxKSwgcmVkdWN0aW9uID0gIkRJTV9VTUFQIikgKwogIGNvb3JkX2ZpeGVkKCkgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiMwMDAwMDAiLCAiI2Y1NGUxZSIpKQoKYzJfcGxvdCA8LSBEaW1QbG90KHNldXJhdC5vYmplY3QsIHJlcGVsID0gVFJVRSwgbGFiZWwuc2l6ZSA9IDUsIHB0LnNpemUgPSAwLjUsIGNlbGxzLmhpZ2hsaWdodCA9IGN1cnZlX3R3b19jZWxscywgZGltcyA9IGMoMiwxKSwgcmVkdWN0aW9uID0gIkRJTV9VTUFQIikgKwogIGNvb3JkX2ZpeGVkKCkgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiMwMDAwMDAiLCAiI2Y1NGUxZSIpKQoKYzNfcGxvdCA8LSBEaW1QbG90KHNldXJhdC5vYmplY3QsIHJlcGVsID0gVFJVRSwgbGFiZWwuc2l6ZSA9IDUsIHB0LnNpemUgPSAwLjUsIGNlbGxzLmhpZ2hsaWdodCA9IGN1cnZlX3RocmVlX2NlbGxzLCBkaW1zID0gYygyLDEpLCByZWR1Y3Rpb24gPSAiRElNX1VNQVAiKSArCiAgY29vcmRfZml4ZWQoKSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiIzAwMDAwMCIsICIjZjU0ZTFlIikpCgpjNF9wbG90IDwtIERpbVBsb3Qoc2V1cmF0Lm9iamVjdCwgcmVwZWwgPSBUUlVFLCBsYWJlbC5zaXplID0gNSwgcHQuc2l6ZSA9IDAuNSwgY2VsbHMuaGlnaGxpZ2h0ID0gY3VydmVfZm91cl9jZWxscywgZGltcyA9IGMoMiwxKSwgcmVkdWN0aW9uID0gIkRJTV9VTUFQIikgKwogIGNvb3JkX2ZpeGVkKCkgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiMwMDAwMDAiLCAiI2Y1NGUxZSIpKQoKcGxvdF9ncmlkKGMxX3Bsb3QsIGMyX3Bsb3QsIGMzX3Bsb3QsIGM0X3Bsb3QsIGxhYmVscyA9IGMoJ2N1cnZlIDEnLCAnY3VydmUgMicsICdjdXJ2ZSAzJywgJ2N1cnZlIDQnKSwgbGFiZWxfc2l6ZSA9IDEyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJvdz0yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICkKYGBgCgoKCkFkZCBkYXRhIHRvIFNldXJhdDoKYGBge3J9CiMjIGV4dHJhY3QgZGF0YSB0byBhZGQgdG8gU2V1cmF0CiMjIGV4dHJhY3QgY2x1c3RlcnMKbWV0YV9kYXRhX3RvX2FkZF9mcm9tX3NsaW5nc2hvdCA8LSBkYXRhLmZyYW1lKGNsdXN0ZXJzX2tfbWVhbnNfVU1BUCA9IGNsdXN0ZXJzKQojIyBBZGQgcHNldWRvdGltZXMKIyBjaGVjayB0aGUgbGVuZ3RoIG9mIGVhY2ggYnJhbmNoIHRvIHNlZSB3aGljaCBjdXJ2ZSBpcyB3aGljaCB1c2luZzogc3VtKGlzLm5hKGFzLmRhdGEuZnJhbWUoc2xpbmdQc2V1ZG90aW1lKGNydjEpKSRjdXJ2ZTEpKQojIHRoZW4gaW5zcGVjdCB1c2luZyB0aGUgZ2dwbG90MiBhYm92ZSB0byB3aGVyZSBtYWxlcyBhcmUgLSAKIyB0YWlsKGFzLmRhdGEuZnJhbWUoc2xpbmdQc2V1ZG90aW1lKGNydjEpKSwgMTAwKQojIHRhaWwobWV0YV9kYXRhX3RvX2FkZF9mcm9tX3NsaW5nc2hvdCwgMTAwKQptZXRhX2RhdGFfdG9fYWRkX2Zyb21fc2xpbmdzaG90JFBUX0ZlbWFsZV9VTUFQIDwtIGFzLmRhdGEuZnJhbWUoc2xpbmdQc2V1ZG90aW1lKGNydjEpKSRjdXJ2ZTEKbWV0YV9kYXRhX3RvX2FkZF9mcm9tX3NsaW5nc2hvdCRQVF9NYWxlX1VNQVAgPC0gYXMuZGF0YS5mcmFtZShzbGluZ1BzZXVkb3RpbWUoY3J2MSkpJGN1cnZlMgojIyBhZGQgZGVzaWduYXRpb24gdG8gU0NFIG9iamVjdAptZXRhX2RhdGFfdG9fYWRkX2Zyb21fc2xpbmdzaG90JHNleF9VTUFQIDwtICJwcmUtZGV0IgptZXRhX2RhdGFfdG9fYWRkX2Zyb21fc2xpbmdzaG90JHNleF9VTUFQW3doaWNoKGlzLm5hKG1ldGFfZGF0YV90b19hZGRfZnJvbV9zbGluZ3Nob3QkUFRfRmVtYWxlX1VNQVApKV0gPC0gIm1hbGUiCm1ldGFfZGF0YV90b19hZGRfZnJvbV9zbGluZ3Nob3Qkc2V4X1VNQVBbd2hpY2goaXMubmEobWV0YV9kYXRhX3RvX2FkZF9mcm9tX3NsaW5nc2hvdCRQVF9NYWxlX1VNQVApKV0gPC0gImZlbWFsZSIKCiMjIGlmIHRoZXJlIGFyZSAzIGN1cnZlcyBpbiBzbGluZ1BzZXVkb3RpbWUoY3J2MSk6CiNtZXRhX2RhdGFfdG9fYWRkX2Zyb21fc2xpbmdzaG90JHNleF9VTUFQW3doaWNoKGlzLm5hKG1ldGFfZGF0YV90b19hZGRfZnJvbV9zbGluZ3Nob3QkUFRfRmVtYWxlX1VNQVApICYgaXMubmEoYXMuZGF0YS5mcmFtZShzbGluZ1BzZXVkb3RpbWUoY3J2MSkpJGN1cnZlMykpXSA8LSAibWFsZSIKI21ldGFfZGF0YV90b19hZGRfZnJvbV9zbGluZ3Nob3Qkc2V4X1VNQVBbd2hpY2goaXMubmEobWV0YV9kYXRhX3RvX2FkZF9mcm9tX3NsaW5nc2hvdCRQVF9NYWxlX1VNQVApICYgaXMubmEoYXMuZGF0YS5mcmFtZShzbGluZ1BzZXVkb3RpbWUoY3J2MSkpJGN1cnZlMykpXSA8LSAiZmVtYWxlIgoKIyMgYWRkIGNsdXN0ZXJzIHRvIFNDRSBvYmplY3QKdGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXggPC0gQWRkTWV0YURhdGEodGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXgsIG1ldGFfZGF0YV90b19hZGRfZnJvbV9zbGluZ3Nob3QpCmBgYAoKYGBge3IsIGZpZy5oZWlnaHQgPSA1LCBmaWcud2lkdGggPSAxMH0KIyMgcGxvdApGZWF0dXJlUGxvdCh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleCwgbGFiZWwuc2l6ZSA9IDUsIHB0LnNpemUgPSAwLjUsIGZlYXR1cmVzID0gYygiUFRfRmVtYWxlX1VNQVAiLCAiUFRfTWFsZV9VTUFQIikpICsKICB0aGVtZV92b2lkKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArCiAgZ3VpZGVzKGNvbG91cj1ndWlkZV9sZWdlbmQobnJvdz0zLGJ5cm93PVRSVUUsIG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZT00KSkpCmBgYAoKCgpwbG90IHNleCBkZXNpZ25hdGlvbnMKYGBge3IsIGZpZy5oZWlnaHQgPSA3LCBmaWcud2lkdGggPSA3fQpEaW1QbG90KHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4LCBsYWJlbCA9IFRSVUUsIHJlcGVsID0gVFJVRSwgbGFiZWwuc2l6ZSA9IDUsIHB0LnNpemUgPSAwLjUsIGdyb3VwLmJ5ID0gInNleF9VTUFQIiwgbmEudmFsdWUgPSAid2hpdGUiKSArCiAgY29vcmRfZml4ZWQoKSArCiAgdGhlbWVfdm9pZCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogIGd1aWRlcyhjb2xvdXI9Z3VpZGVfbGVnZW5kKG5yb3c9MyxieXJvdz1UUlVFLCBvdmVycmlkZS5hZXMgPSBsaXN0KHNpemU9NCkpKQpgYGAKCgoKCiMgNi4gTW9ub2NsZSBvbiBzZXggY2VsbHMgey50YWJzZXR9CgojIyBjYWxjdWxhdGUgcHNldWRvdGltZSBhbmQgbW9kdWxlcwoKIyMjIyBQcmVwYXJhdGlvbgpgYGB7cn0KIyMgZXh0cmFjdHMgb25seSAxMHggY2VsbHMgYW5kIGFsc28gcmVtb3ZlIGNsdXN0ZXIgMCBjZWxscyAKd3RfY2VsbHMgPC0gcm93bmFtZXModGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXhAbWV0YS5kYXRhW3doaWNoKHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YSRpZGVudGl0eV9jb21iaW5lZCA9PSAiV1RfMTBYIiAmICF0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGEkc2V1cmF0X2NsdXN0ZXJzID09ICI3IiksXSkKCiMjIG1ha2UgYSBuZXcgU2V1cmF0IG9mIHRoaXMKc2V1cmF0Lm9iamVjdCA8LXN1YnNldCh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleCwgY2VsbHMgPSB3dF9jZWxscykKCiMjIGNoZWNrIHRoYXQgdGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgcGJfc2V4X2ZpbHRlcmVkIG9iamVjdAojZGF0YV90ZXN0IDwtIGFzKGFzLm1hdHJpeChHZXRBc3NheURhdGEocGJfc2V4X2ZpbHRlcmVkLCBhc3NheSA9ICJSTkEiLCBzbG90ID0gImRhdGEiKSksICdzcGFyc2VNYXRyaXgnKQojaXMuZXF1YWwKI2lzLmlkZW50aWNhbAoKIyMgZXh0cmFjdCBjb3VudHMgYW5kIHBoZW5vOgojIyB0aGUgcmVhc29uIHdlIHVzZSB0aGUgaW50ZWdyYXRlZCBhbmQgdGhlbiBzdWJzZXR0ZWQgaXMgYmVjYXVzZSB0aGVzZSBjZWxscyBoYXZlIGJlZW4gbm9ybWFsaXNlZCB3aGVyZWFzIHRoZSBjZWxscyBpbiBwYl9zZXhfZmlsdGVyZWQgaGF2ZSBub3QgYmVlbiBub3JtYWxpc2VkICh3ZWxsIHRoZXkgaGF2ZSBidXQgd2l0aCBkb3VibGV0cyBpbiB0aGVtKQojIyB3aXRoIDEweCBvbmx5IGNlbGxzOiBhbGwuZXF1YWwoYXMuZGF0YS5mcmFtZShjb3VudHMobW9ub2NsZS5vYmplY3QpKSwgYXMuZGF0YS5mcmFtZShhcy5tYXRyaXgoR2V0QXNzYXlEYXRhKHNldXJhdC5vYmplY3QsIGFzc2F5ID0gIlJOQSIsIHNsb3QgPSAiY291bnRzIikpKSkgcmV0dXJucyBUUlVFIGFuZCBhbHNvIHJldHVybnMgdHJ1ZSB3aGVuIHlvdSBjaGFuZ2UgdGhlIHNsb3QgaW5wdXQgdG8gImNvdW50cyIgYW5kIHVzZSBtb25vY2xlIHRvIG5vcm0gaXQgd2l0aCBtZXRob2QgImxvZyIKZGF0YSA8LSBhcyhhcy5tYXRyaXgoR2V0QXNzYXlEYXRhKHNldXJhdC5vYmplY3QsIGFzc2F5ID0gIlJOQSIsIHNsb3QgPSAiZGF0YSIpKSwgJ3NwYXJzZU1hdHJpeCcpCiMjIG1ha2UgcGhlbm9kYXRhCnBkIDwtIGRhdGEuZnJhbWUoc2V1cmF0Lm9iamVjdEBtZXRhLmRhdGEpCiMjIGtlZXAgb25seSB0aGUgY29sdW1ucyB0aGF0IGFyZSByZWxldmFudCBpbiBtZXRhZGF0YQojcERhdGEgPC0gcGQgJT4lIHNlbGVjdChvcmlnLmlkZW50LCBuQ291bnRfUk5BLCBuRmVhdHVyZV9STkEpCiMjIG1ha2UgZ2VuZSBtZXRhZGF0YQpmRGF0YSA8LSBkYXRhLmZyYW1lKGdlbmVfc2hvcnRfbmFtZSA9IHJvdy5uYW1lcyhkYXRhKSwgcm93Lm5hbWVzID0gcm93Lm5hbWVzKGRhdGEpKQoKIyMgQ29uc3RydWN0IG1vbm9jbGUgY2RzCm1vbm9jbGUub2JqZWN0IDwtIG5ld19jZWxsX2RhdGFfc2V0KGV4cHJlc3Npb25fZGF0YSA9IGRhdGEsIGNlbGxfbWV0YWRhdGEgPSBwZCwgZ2VuZV9tZXRhZGF0YSA9IGZEYXRhKQoKIyMgcHJlcHJvY2Vzcwptb25vY2xlLm9iamVjdCA9IHByZXByb2Nlc3NfY2RzKG1vbm9jbGUub2JqZWN0LCBudW1fZGltID0gNTAsIG5vcm1fbWV0aG9kID0gIm5vbmUiKQojIyMgaWYgdXNpbmcgaW50ZWdyYXRlZCBkYXRhOgojIG5vcm1fbWV0aG9kID0gIm5vbmUiLCBhbGlnbm1lbnRfZ3JvdXAgPSAifiBleHBlcmltZW50IgoKIyMgcGxvdCBqYWNrIHN0cmF3IHBsb3QKI3Bsb3RfcGNfdmFyaWFuY2VfZXhwbGFpbmVkKG1vbm9jbGUub2JqZWN0KQoKI21vbm9jbGUub2JqZWN0ID0gcmVkdWNlX2RpbWVuc2lvbihtb25vY2xlLm9iamVjdCwgcmVkdWN0aW9uX21ldGhvZCA9ICJVTUFQIiwgcHJlcHJvY2Vzc19tZXRob2QgPSAiUENBIiwgdW1hcC5tZXRyaWMgPSAiZXVjbGlkZWFuIiwgdW1hcC5uX25laWdoYm9ycyA9IDUwLCB1bWFwLm1pbl9kaXN0ID0gMC41LCB2ZXJib3NlID0gRkFMU0UpCgojcGxvdF9jZWxscyhtb25vY2xlLm9iamVjdCwgY29sb3JfY2VsbHNfYnk9ImV4cGVyaW1lbnQiKQoKIyMgZ3JhcGggbGVhcm5pbmcKCiMjIGFkZCBVTUFQIGZyb20gU2V1cmF0Cm1vbm9jbGUub2JqZWN0QGludF9jb2xEYXRhQGxpc3REYXRhJHJlZHVjZWREaW1zQGxpc3REYXRhW1siVU1BUCJdXSA8LSBzZXVyYXQub2JqZWN0QHJlZHVjdGlvbnNbWyJESU1fVU1BUCJdXUBjZWxsLmVtYmVkZGluZ3MKIyMgaWYgeW91IHdhbnQgdGhlIG9sZCBVTUFQIGZyb20gdGhlIG9yaWdpbmFsIGFsbCBjZWxscyBvbmUsIHVzZTogIkRJTV9VTUFQIgoKIyMgY2x1c3RlcgojIyB0aGlzIGlzIGVzc2VudGlhbCB0byBydW4gdGhlIGxlYXJuX2dyYXBoIGZ1bmN0aW9uIGxhdGVyIG9uCm1vbm9jbGUub2JqZWN0ID0gY2x1c3Rlcl9jZWxscyhtb25vY2xlLm9iamVjdCkKCiMjIHBsb3QgaW5pdGlhbCBjbHVzdGVyaW5nIGJ5IG1vbm9jbGUKI3Bsb3RfY2VsbHMobW9ub2NsZS5vYmplY3QsIGNvbG9yX2NlbGxzX2J5PSJjbHVzdGVyIiwgZ3JvdXBfY2VsbHNfYnk9InBhcnRpdGlvbiIsIHggPSAyLCB5ID0gMSkKCiMjIG1hcCBwc2V1ZG90aW1lCm1vbm9jbGUub2JqZWN0ID0gbGVhcm5fZ3JhcGgobW9ub2NsZS5vYmplY3QsIGxlYXJuX2dyYXBoX2NvbnRyb2w9bGlzdChuY2VudGVyPTI1MCwgbWluaW1hbF9icmFuY2hfbGVuID0gMzApLCB1c2VfcGFydGl0aW9uID0gRkFMU0UpCiMgbGVhcm5fZ3JhcGhfY29udHJvbD1saXN0KG5jZW50ZXI9NTAwKSAtIHBsYXkgd2l0aCB0aGlzIHBhcmFtZXRlciAtIGxvd2VyIHRlbmRzIHRvIGdpdmUgZmV3ZXIgYnJhbmNoZXMgYW5kIGhpZ2hlciB0ZW5kcyB0byBnaXZlIG1vcmUKIyA1MDAgLSBvbGQgYW5hbHlzaXMKIyAyNTAgLSBuZXcgYW5hbHlzaXMgCgojIyBQbG90IGNlbGxzCnBsb3RfY2VsbHMobW9ub2NsZS5vYmplY3QsIGNvbG9yX2NlbGxzX2J5PSJwYXJ0aXRpb24iLCBncm91cF9jZWxsc19ieT0icGFydGl0aW9uIiwgeCA9IDIsIHkgPSAxKQpgYGAKCkRlZmluZSBpZGVudGl0aWVzIG9mIGNlbGxzIAoKbWFsZQpgYGB7cn0KbW9ub2NsZS5vYmplY3RfbWFsZSA8LSBjaG9vc2VfZ3JhcGhfc2VnbWVudHMobW9ub2NsZS5vYmplY3QpCmBgYApmZW1hbGUKYGBge3J9Cm1vbm9jbGUub2JqZWN0X2ZlbWFsZSA8LSBjaG9vc2VfZ3JhcGhfc2VnbWVudHMobW9ub2NsZS5vYmplY3QpCmBgYApiaXBvdGVudGlhbApgYGB7cn0KbW9ub2NsZS5vYmplY3RfYmlwb3QgPC0gY2hvb3NlX2dyYXBoX3NlZ21lbnRzKG1vbm9jbGUub2JqZWN0KQpgYGAKYXNleHVhbApgYGB7cn0KbW9ub2NsZS5vYmplY3RfYXNleCA8LSBjaG9vc2VfZ3JhcGhfc2VnbWVudHMobW9ub2NsZS5vYmplY3QpCmBgYAphc2V4dWFsIGZhdGUKYGBge3J9Cm1vbm9jbGUub2JqZWN0X2FzZXhfZmF0ZSA8LSBjaG9vc2VfZ3JhcGhfc2VnbWVudHMobW9ub2NsZS5vYmplY3QpCmBgYApjaGVjawpgYGB7cn0KZGZfZnJlcSA8LSBkYXRhLmZyYW1lKHRhYmxlKGMoY29sbmFtZXMobW9ub2NsZS5vYmplY3RfbWFsZSksIGNvbG5hbWVzKG1vbm9jbGUub2JqZWN0X2ZlbWFsZSksIGNvbG5hbWVzKG1vbm9jbGUub2JqZWN0X2JpcG90KSwgY29sbmFtZXMobW9ub2NsZS5vYmplY3RfYXNleCksIGNvbG5hbWVzKG1vbm9jbGUub2JqZWN0X2FzZXhfZmF0ZSkpKSkKcGFzdGUoIm51bWJlciBvZiBjZWxscyBpbiBzZXVyYXQgb2JqZWN0IGlzIiwgbGVuZ3RoKGNvbG5hbWVzKG1vbm9jbGUub2JqZWN0KSksICIuIFRoZSBudW1iZXIgb2YgY2VsbHMgc2VsZWN0ZWQgaGVyZSB3aXRoIGFuIGlkZW50aXRpdHkgaXMiLCBkaW0oZGZfZnJlcSlbMV0pCmRmX2ZyZXEgPC0gZGZfZnJlcVtkZl9mcmVxJEZyZXEgPiAxLCBdCmRmX2ZyZXEKYGBgCkluc3BlY3Qgd2hlcmUgdGhlc2UgbWlzc2luZyBjZWxscyBhcmU6CmBgYHtyfQonJW5pJScgPC0gTmVnYXRlKCclaW4lJykKCm5vdF9hc3NpZ25lZF9jZWxscyA8LSBjb2xuYW1lcyhtb25vY2xlLm9iamVjdClbY29sbmFtZXMobW9ub2NsZS5vYmplY3QpICVuaSUgYyhjb2xuYW1lcyhtb25vY2xlLm9iamVjdF9tYWxlKSwgY29sbmFtZXMobW9ub2NsZS5vYmplY3RfZmVtYWxlKSwgY29sbmFtZXMobW9ub2NsZS5vYmplY3RfYmlwb3QpLCBjb2xuYW1lcyhtb25vY2xlLm9iamVjdF9hc2V4KSwgY29sbmFtZXMobW9ub2NsZS5vYmplY3RfYXNleF9mYXRlKSldCgpEaW1QbG90KHNldXJhdC5vYmplY3QsIHJlcGVsID0gVFJVRSwgbGFiZWwuc2l6ZSA9IDUsIHB0LnNpemUgPSAwLjUsIGNlbGxzLmhpZ2hsaWdodCA9IG5vdF9hc3NpZ25lZF9jZWxscywgZGltcyA9IGMoMiwxKSwgcmVkdWN0aW9uID0gIkRJTV9VTUFQIikgKwogIGNvb3JkX2ZpeGVkKCkgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiMwMDAwMDAiLCAiI2Y1NGUxZSIpKQpgYGAKCmBgYHtyfQojIyBjcmVhdGUgYW5ub3RhdGlvbiBkYXRhZnJhbWUgZnJvbSB0aGVzZSByZXN1bHRzOgpkZl9tb25vY2xlX3NleGVzIDwtIHJiaW5kKGRhdGEuZnJhbWUoImNlbGxfbmFtZSIgPSBjb2xuYW1lcyhtb25vY2xlLm9iamVjdF9tYWxlKSwgInNleCIgPSByZXAoIk1hbGUiLCBsZW5ndGgoY29sbmFtZXMobW9ub2NsZS5vYmplY3RfbWFsZSkpKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5mcmFtZSgiY2VsbF9uYW1lIiA9IGNvbG5hbWVzKG1vbm9jbGUub2JqZWN0X2ZlbWFsZSksICJzZXgiID0gcmVwKCJGZW1hbGUiLCBsZW5ndGgoY29sbmFtZXMobW9ub2NsZS5vYmplY3RfZmVtYWxlKSkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZyYW1lKCJjZWxsX25hbWUiID0gY29sbmFtZXMobW9ub2NsZS5vYmplY3RfYmlwb3QpLCAic2V4IiA9IHJlcCgiQmlwb3RlbnRpYWwiLCBsZW5ndGgoY29sbmFtZXMobW9ub2NsZS5vYmplY3RfYmlwb3QpKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZnJhbWUoImNlbGxfbmFtZSIgPSBjb2xuYW1lcyhtb25vY2xlLm9iamVjdF9hc2V4KSwgInNleCIgPSByZXAoIkFzZXh1YWwiLCBsZW5ndGgoY29sbmFtZXMobW9ub2NsZS5vYmplY3RfYXNleCkpKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5mcmFtZSgiY2VsbF9uYW1lIiA9IGNvbG5hbWVzKG1vbm9jbGUub2JqZWN0X2FzZXhfZmF0ZSksICJzZXgiID0gcmVwKCJBc2V4dWFsX0ZhdGUiLCBsZW5ndGgoY29sbmFtZXMobW9ub2NsZS5vYmplY3RfYXNleF9mYXRlKSkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZyYW1lKCJjZWxsX25hbWUiID0gbm90X2Fzc2lnbmVkX2NlbGxzLCAic2V4IiA9IHJlcCgiVW5hc3NpZ25lZCIsIGxlbmd0aChub3RfYXNzaWduZWRfY2VsbHMpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICApCgpkaW0oZGZfbW9ub2NsZV9zZXhlcykKCiMjIG9yZGVyIGxpa2UgdGhlIG1ldGFkYXRhCmRmX21vbm9jbGVfc2V4ZXMgPC0gZGZfbW9ub2NsZV9zZXhlc1ttYXRjaChyb3duYW1lcyhtb25vY2xlLm9iamVjdEBjb2xEYXRhKSwgZGZfbW9ub2NsZV9zZXhlcyRjZWxsX25hbWUpLCBdCgojIyBhZGQgdGhpcyBiYWNrIGludG8gdGhlIG1vbm9jbGUgb2JqZWN0Cm1vbm9jbGUub2JqZWN0QGNvbERhdGEkU2V4ZXNfbW9ub2NsZSA8LSBkZl9tb25vY2xlX3NleGVzJHNleApgYGAKCiMjIyMgUHNldWRvdGltZSBDYWxjdWxhdGlvbgpgYGB7cn0KIyMgT3JkZXIgdGhlIGNlbGxzIGFuZCBjYWxjdWxhdGUgcHNldWRvdGltZQptb25vY2xlLm9iamVjdCA9IG9yZGVyX2NlbGxzKG1vbm9jbGUub2JqZWN0KQoKIyMgUGxvdAp1bWFwX3B0IDwtIHBsb3RfY2VsbHMobW9ub2NsZS5vYmplY3QsIGNvbG9yX2NlbGxzX2J5ID0gInBzZXVkb3RpbWUiLCBsYWJlbF9jZWxsX2dyb3Vwcz1GQUxTRSwgY2VsbF9zaXplID0gMSwgeCA9IDIsIHkgPSAxLCBsYWJlbF9icmFuY2hfcG9pbnRzPUZBTFNFLCBsYWJlbF9sZWF2ZXM9RkFMU0UsIGxhYmVsX2dyb3Vwc19ieV9jbHVzdGVyPUZBTFNFLCBsYWJlbF9yb290cyA9IEZBTFNFKSArCiAgY29vcmRfZml4ZWQoKSArCiAgdGhlbWVfdm9pZCgpICsKICBsYWJzKHRpdGxlID0gIlBzZXVkb3RpbWUiKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCgojIyB2aWV3CnVtYXBfcHQKYGBgCnNhdmUKYGBge3J9Cmdnc2F2ZSgiLi4vaW1hZ2VzX3RvX2V4cG9ydC9HQ1NLT19zZXhicmFuY2hfdW1hcF9wdC5wbmciLCBwbG90ID0gdW1hcF9wdCwgZGV2aWNlID0gInBuZyIsIHBhdGggPSBOVUxMLCBzY2FsZSA9IDEsIHdpZHRoID0gMTAsIGhlaWdodCA9IDEwLCB1bml0cyA9ICJjbSIsIGRwaSA9IDMwMCwgbGltaXRzaXplID0gVFJVRSkKYGBgCgpKdXN0IGNoZWNrIGlmIHRoZSAnaG9vaycgb24gdGhlIG1hbGVzIGlzIGEgbGluZWFnZSBvciBkZWFkL2R5aW5nL2FjdGl2YXRlZCBnYW1zLCBvciBtdXRhbnRzCgpgYGB7cn0KRmVhdHVyZVBsb3QodGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXgsIGZlYXR1cmVzID0gIlBCQU5LQS0wNDE2MTAwIiwgY29vcmQuZml4ZWQgPSBUUlVFLCBtaW4uY3V0b2ZmID0gInExIiwgZGltcyA9IGMoMiwxKSwgcmVkdWN0aW9uID0gIkRJTV9VTUFQIiwgcHQuc2l6ZSA9IDEsIG9yZGVyID0gVFJVRSkgKyAKICAgICAgICAgICAgdGhlbWVfdm9pZCgpICsgCiAgICAgICAgICAgIGxhYnModGl0bGUgPSBwYXN0ZSgiTUcxIChNYWxlKSIpKSArIAogICAgICAgICAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBmYW1pbHk9IkFyaWFsIiwgc2l6ZSA9IDIwLCBmYWNlID0gImJvbGQiKSkgKyAKICAgICAgICAgICAgc2NhbGVfY29sb3VyX2dyYWRpZW50bihjb2xvdXJzPWMoIiNEQ0RDREMiLCBwbGFzbWEoMzApKSkKYGBgCgpJdCBhcHBlYXJzIE1HMSBtYXJrZXIgZXhwcmVzc2lvbiBpcyBkZWNyZWFzaW5nL29mZiBpbiB0aGVzZSBjZWxscyAtIGluc3BlY3QgbXV0YW50IHN0YXR1cwoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5oZWlnaHQgPSA0fQpwbG90IDwtIERpbVBsb3QodGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXgsIGxhYmVsID0gRkFMU0UsIGxhYmVsLnNpemUgPSA4LCByZXBlbCA9IEZBTFNFLCBwdC5zaXplID0gMC4wNSwgZGltcyA9IGMoMiwxKSwgcmVkdWN0aW9uID0gIkRJTV9VTUFQIiwgZ3JvdXAuYnkgPSAiaWRlbnRpdHlfdXBkYXRlZCIpICsgCiAgY29vcmRfZml4ZWQoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iLCAKICAgICAgICBheGlzLmxpbmU9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcz1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF9ibGFuaygpKSArIAogIGd1aWRlcyhjb2xvdXI9Z3VpZGVfbGVnZW5kKG5yb3cgPSAzLCBieXJvdyA9IFRSVUUsIG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZT01KSkpCgpIb3ZlckxvY2F0b3IocGxvdCA9IHBsb3QsIGluZm9ybWF0aW9uID0gRmV0Y2hEYXRhKHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4LCB2YXJzID0gYygiaWRlbnQiLCAiaWRlbnRpdHlfdXBkYXRlZCIsICJuRmVhdHVyZV9STkEiKSkpCmBgYAoKIyMjIyBDaGVjayBob3cgd2VsbCBpdCBjb3JyZWxhdGVzIHdpdGggdGhlIG9yaWdpbmFsIHBzZXVkb3RpbWUKCndoZW4gcHNldWRvdGltZSB3YXMgY2FsY3VsYXRlZCBvbiB0aGUgd2hvbGUgb2JqZWN0CgpgYGB7cn0KbGlicmFyeShnZ3B1YnIpCiMjIGV4dHJhY3QgcHNldWRvdGltZSB2YWx1ZXM6CnB0X3ZhbHVlc19uZXcgPC0gYXMuZGF0YS5mcmFtZShwc2V1ZG90aW1lKG1vbm9jbGUub2JqZWN0LCByZWR1Y3Rpb25fbWV0aG9kID0gIlVNQVAiKSkKcHRfdmFsdWVzX25ldyRjZWxsX25hbWUgPC0gcm93bmFtZXMocHRfdmFsdWVzX25ldykKbWV0YV9kYXRhX2RmIDwtIGFzLmRhdGEuZnJhbWUobW9ub2NsZS5vYmplY3RAY29sRGF0YSkKbWV0YV9kYXRhX2RmJGNlbGxfbmFtZSA8LSByb3duYW1lcyhtZXRhX2RhdGFfZGYpCm1ldGFfZGF0YV9kZiA8LSBtZXJnZShtZXRhX2RhdGFfZGYsIHB0X3ZhbHVlc19uZXcsIGJ5ID0gImNlbGxfbmFtZSIpCm5hbWVzKG1ldGFfZGF0YV9kZilbbmNvbChtZXRhX2RhdGFfZGYpXTwtICJwdCIKCmdncGxvdChtZXRhX2RhdGFfZGYsIGFlcyh4ID0gb2xkX3B0X3ZhbHVlcywgeSA9IHB0LCBjb2xvdXIgPSBjbHVzdGVyX2NvbG91cnNfZmlndXJlKSkgKyAKICBnZW9tX3BvaW50KCkgKyAgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSkgKwogIHRoZW1lX2NsYXNzaWMoKSArIHN0YXRfY29yKG1ldGhvZCA9ICJwZWFyc29uIikKYGBgCgpUaGlzIHNob3dzIHZlcnkgZ29vZCBjb3JyZWxhdGlvbi4KCiMjIyMgSXNvbGF0ZSBCcmFuY2hlcwoKYGBge3J9CiMjIGFjY2VzcyB0aGUgY2xvc2VzdCBwcmluY2lwYWwgZ3JhcGggbm9kZSB2ZXJ0ZXggZm9yIGVhY2ggY2VsbCBhbmQgYXNzaWduIGl0IGFzIGEgY29sdW1uIGluIHlvdXIgY29sRGF0YSB0YWJsZSB1c2luZwojY29sRGF0YShtb25vY2xlLm9iamVjdCkkY2xvc2VzdF92ZXJ0ZXggPC0gbW9ub2NsZS5vYmplY3RAcHJpbmNpcGFsX2dyYXBoX2F1eFtbIlVNQVAiXV0kcHJfZ3JhcGhfY2VsbF9wcm9qX2Nsb3Nlc3RfdmVydGV4WywxXQoKIyMgcGxvdAojcGxvdF9jZWxscyhtb25vY2xlLm9iamVjdCwgY29sb3JfY2VsbHNfYnkgPSAiY2xvc2VzdF92ZXJ0ZXgiLCBsYWJlbF9jZWxsX2dyb3VwcyA9IEZBTFNFKQpgYGAKCiMjIyMgTW9kdWxlIENvbnN0cnVjdGlvbgpgYGB7cn0KIyMgZmluZCBnZW5lcyB0aGF0IGNoYW5nZSBhcyBhIGZ1bmN0aW9uIG9mIHB0Ogptb25vY2xlLm9iamVjdF9wcl90ZXN0X3JlcyA8LSBncmFwaF90ZXN0KG1vbm9jbGUub2JqZWN0LCBuZWlnaGJvcl9ncmFwaD0icHJpbmNpcGFsX2dyYXBoIiwgY29yZXM9OCkKCiMjIGZpbmQgc2lnbmlmaWNhbnQgZ2VuZXMKIyMgSSB1c2VkIDAuMDUgcHJldmlvdXNseSBpbiBhbGwgY2VsbHMgCiMjIDI4ODQgdy4gcCA9IDAuMDEsIDMyNjAgdy4gcCA9IDAuMDUKcHJfZGVnX2lkcyA8LSByb3cubmFtZXMoc3Vic2V0KG1vbm9jbGUub2JqZWN0X3ByX3Rlc3RfcmVzLCBxX3ZhbHVlIDwgMC4wNSkpCgojIyBjb2xsZWN0IGludG8gbW9kdWxlcwpnZW5lX21vZHVsZV9kZl9zZXggPC0gZmluZF9nZW5lX21vZHVsZXMobW9ub2NsZS5vYmplY3RbcHJfZGVnX2lkcyxdLCByZXNvbHV0aW9uPWMoMTBec2VxKC02LDIpKSwgcmFuZG9tX3NlZWQgPSAxMjM0KQoKIyMgaG93IG1hbnkgZ2VuZXMgaW4gbW9kdWxlcz8KZGltKGdlbmVfbW9kdWxlX2RmX3NleCkKYGBgCgpgYGB7ciwgZWNobyA9IEZBTFNFfQpwYXN0ZSgidGhlcmUgYXJlIiwgbGVuZ3RoKGxldmVscyhnZW5lX21vZHVsZV9kZl9zZXgkbW9kdWxlKSksICJtb2R1bGVzIikKYGBgCgojIyBQbG90IE1vZHVsZXMKCiMjIyMgR2VuZXJhbCBNb2R1bGUgQ29tcG9zaXRpb24KCk1ha2UgYSBkYXRhZnJhbWUgdG8gcGxvdCBieSBhZ2dyZWdhdGluZyBjbHVzdGVycyB2cy4gbW9kdWxlcwpgYGB7cn0KIyMgbWFrZSBjZWxsIGdyb3VwIGRmCmNlbGxfZ3JvdXBfZGYgPC0gdGliYmxlOjp0aWJibGUoY2VsbD1yb3cubmFtZXMoY29sRGF0YShtb25vY2xlLm9iamVjdCkpLCBjZWxsX2dyb3VwPWNvbERhdGEobW9ub2NsZS5vYmplY3QpJHNldXJhdF9jbHVzdGVycykKCiMjIG1ha2UgcGxvdHRpbmcgZGYKYWdnX21hdCA8LSBhZ2dyZWdhdGVfZ2VuZV9leHByZXNzaW9uKG1vbm9jbGUub2JqZWN0LCBnZW5lX21vZHVsZV9kZl9zZXgsIGNlbGxfZ3JvdXBfZGYpCmBgYAoKRmluZCBvdXQgaG93IG1hbnkgZ2VuZXMgdGhlcmUgYXJlIHBlciB0b3RhbCBzbyB3ZSBjYW4gYWRkIHRoaXMgdG8gdGhlIHBsb3QKYGBge3J9CiMjIGhvdyBtYW55IGdlbmVzIHBlciBtb2R1bGU/CmdlbmVzX3Blcl9tb2R1bGUgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShnZW5lX21vZHVsZV9kZl9zZXgkbW9kdWxlKSkKZ2VuZXNfcGVyX21vZHVsZQpgYGAKCkZpbmQgb3V0IHdoaWNoIG1vZHVsZXMgb3VyIG11dGFudCBnZW5lcyByZXNpZGUgaW4KYGBge3J9CiMjIGNyZWF0ZSBhIGxpc3Qgb2Ygb3VyIG11dGFudCBnZW5lIElEcwpsaXN0X29mX211dGFudF9nZW5lcyA8LSBjKCJQQkFOS0EtMDgyODAwMCIsICJQQkFOS0EtMTMwMjcwMCIsICJQQkFOS0EtMTQ0NzkwMCIsICJQQkFOS0EtMDEwMjQwMCIsICJQQkFOS0EtMDcxNjUwMCIsICJQQkFOS0EtMTQzNTIwMCIsICJQQkFOS0EtMTQxODEwMCIsICJQQkFOS0EtMDkwMjMwMCIsICJQQkFOS0EtMDQxMzQwMCIsICJQQkFOS0EtMTQ1NDgwMCIpCgojIyBtYWtlIGEgZGF0YWZyYW1lIHRvIGNvbnZlcnQgdGhlIGdlbmUgSURzIGludG8gYWN0dWFsIElEcwpkZl9tdXRhbnRfaWRzIDwtIGFzLmRhdGEuZnJhbWUodW5pcXVlKGNiaW5kKHRlbngubXV0YW50LmludGVncmF0ZWRAbWV0YS5kYXRhJGlkZW50aXR5X2dlbmVfdXBkYXRlZCwgdGVueC5tdXRhbnQuaW50ZWdyYXRlZEBtZXRhLmRhdGEkaWRlbnRpdHlfdXBkYXRlZCwgdGVueC5tdXRhbnQuaW50ZWdyYXRlZEBtZXRhLmRhdGEkaWRlbnRpdHlfbmFtZV91cGRhdGVkKSkpWy1jKDEsIDMpLF0KIyByZW1vdmUgdGhlICI4MjAiIGJpdCBvbiAxMApkZl9tdXRhbnRfaWRzJFYxIDwtIGdzdWIoIl84MjAiLCAiIiwgZGZfbXV0YW50X2lkcyRWMSkKIyBjaGFuZ2UgdGhlIHVuZGVyc2NvcmUgKF8pIHRvIGEgZGFzaCAoLSkgaW4gZ2VuZSBJRHMKZGZfbXV0YW50X2lkcyRWMSA8LSBnc3ViKCJfIiwgIi0iLCBkZl9tdXRhbnRfaWRzJFYxKQpuYW1lcyhkZl9tdXRhbnRfaWRzKSA8LSBjKCJnZW5lX0lEIiwgIm11dGFudF9pZGVudGl0eSIsICJtdXRhbnRfaWRlbnRpdHlfMiIpCgojIyBzdWJzZXQgbW9kdWxlcyBkZiB0byBpbmNsdWRlIG9ubHkgbXV0YW50IGdlbmUgSURzCmRmX211dGFudF9nZW5lX21vZHVsZXMgPC0gYXMuZGF0YS5mcmFtZShnZW5lX21vZHVsZV9kZl9zZXhbd2hpY2goZ2VuZV9tb2R1bGVfZGZfc2V4JGlkICVpbiUgbGlzdF9vZl9tdXRhbnRfZ2VuZXMpLF0pCm5hbWVzKGRmX211dGFudF9nZW5lX21vZHVsZXMpWzFdIDwtICJnZW5lX0lEIgoKIyMgbWVyZ2UgZGF0YWZyYW1lcwpkZl9tdXRhbnRfZ2VuZV9tb2R1bGVzIDwtIG1lcmdlKGRmX211dGFudF9nZW5lX21vZHVsZXMsIGRmX211dGFudF9pZHMsIGJ5ID0gImdlbmVfSUQiKQoKIyMgSW5zcGVjdApkZl9tdXRhbnRfZ2VuZV9tb2R1bGVzCmBgYAoKc28gbW9kdWxlcyBvZiBpbnRlcmVzdCBhcmU6CmBgYHtyfQp0YWJsZShkZl9tdXRhbnRfZ2VuZV9tb2R1bGVzJG1vZHVsZSkKYGBgCgpXaGljaCBtb2R1bGVzIGRvIG90aGVyIGdlbmVzIG9mIGludGVyZXN0IGxpZSBpbj86CmBgYHtyfQojIyBsYW5kbWFyayBnZW5lcyAoZ2VuZXMgb2YgaW50ZXJlc3QpCiMgQVAyRyAtIFBCQU5LQS0xNDM3NTAwCiMgQVAyIC0gUEJBTktBLTA5MDk2MDAgLSBmcm9tIHBvcmFuIHBhcGVyCiMgQVAyRy0yIC0gUEJBTktBLTEwMzQzMDAgCiMgY2NwMiAtICJQQkFOS0EtMTMxOTUwMCIgLSBmZW1hbGUgODIwCiMgcDI1IC0gIlBCQU5LQS0wNTE1MDAwIiAtIGZlbWFsZQojIHAyOCAtICJQQkFOS0EtMDUxNDkwMCIgLSBmZW1hbGUKIyBjY3AzIC0gIlBCQU5LQS0xMDM1MjAwIiAtIGZlbWFsZSAtICBodHRwczovL3d3dy5uY2JpLm5sbS5uaWguZ292L3BtYy9hcnRpY2xlcy9QTUM1OTA5MTIyLwojIG5lazQgLSAiUEJBTktBLTA2MTY3MDAiIC0gZmVtYWxlCiMgYXAyLWZnIC0gIlBCQU5LQS0xNDE1NzAwIiAtIGZlbWFsZSAKIyBkb3ppIC0gIlBCQU5LQS0xMjE3NzAwIiAtIGZlbWFsZQojIE1HMSAtICJQQkFOS0EtMDQxNjEwMCIgLSBtYWxlIDgyMAojIGhhcDIgLSAiUEJBTktBLTEyMTI2MDAiIC0gbWFsZQojIE1BUEsyIC0gIlBCQU5LQS0wOTMzNzAwIiAtIG1hbGUKIyBuZWsxIC0gIlBCQU5LQS0xNDQzMDAwIiAtIG1hbGUKIyBjZHBrNCAtICJQQkFOS0EtMDYxNTIwMCIgLSBtYWxlCgojIyBjcmVhdGUgYSBsaXN0IG9mIGxhbmRtYXJrIGdlbmVzCmxpc3Rfb2ZfbGFuZG1hcmtfZ2VuZXMgPC0gYygiUEJBTktBLTE0Mzc1MDAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBCQU5LQS0wOTA5NjAwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQQkFOS0EtMTAzNDMwMCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBCQU5LQS0xMzE5NTAwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUEJBTktBLTA1MTUwMDAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBCQU5LQS0wNTE0OTAwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQQkFOS0EtMTAzNTIwMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUEJBTktBLTA2MTY3MDAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBCQU5LQS0xNDE1NzAwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQQkFOS0EtMTIxNzcwMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUEJBTktBLTA0MTYxMDAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQQkFOS0EtMTIxMjYwMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUEJBTktBLTA5MzM3MDAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBCQU5LQS0xNDQzMDAwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQQkFOS0EtMDYxNTIwMCIpCgpuYW1lX29mX2xhbmRtYXJrX2dlbmVzIDwtIGMoIkFQMi1HIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVAyX3BvcmFuIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVAyLUcyIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2NwMiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInAyNSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInAyOCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2NwMyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmVrNCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXAyLWZnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJET1pJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZzEiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYXAyIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFwazIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5lazEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImNkcGs0IikKCiMjIG1ha2UgYSBkZgpuYW1lX29mX2xhbmRtYXJrX2dlbmVzIDwtIGRhdGEuZnJhbWUoImdlbmVfbmFtZSIgPSBuYW1lX29mX2xhbmRtYXJrX2dlbmVzLCAiaWQiID0gbGlzdF9vZl9sYW5kbWFya19nZW5lcykKCiMjIG1ha2UgZGF0YWZyYW1lCmRmX2xhbmRtYXJrX2dlbmVfbW9kdWxlcyA8LSBnZW5lX21vZHVsZV9kZl9zZXhbd2hpY2goZ2VuZV9tb2R1bGVfZGZfc2V4JGlkICVpbiUgbGlzdF9vZl9sYW5kbWFya19nZW5lcyksXQoKIyMgbWVyZ2UgZGF0YWZyYW1lcwpkZl9sYW5kbWFya19nZW5lX21vZHVsZXMgPC0gbWVyZ2UoZGZfbGFuZG1hcmtfZ2VuZV9tb2R1bGVzLCBuYW1lX29mX2xhbmRtYXJrX2dlbmVzLCBieSA9ICJpZCIpCgojIyBpbnNwZWN0CmRmX2xhbmRtYXJrX2dlbmVfbW9kdWxlcwpgYGAKCmVucmljaG1lbnQgb2Ygc2NyZWVuIGhpdHMgaW4gbW9kdWxlcwpgYGB7cn0KIyMgcmVhZCBpbiBzY3JlZW4gaGl0cwpsaWJyYXJ5KCJyZWFkeGwiKQpzY3JlZW5faGl0cyA8LSByZWFkX2V4Y2VsKCIuLi9kYXRhL1NjcmVlbi9Nb2R1bGVzX0NsdXN0ZXJzX1BoZW5vdHlwZXMueGxzeCIpCgojIyBnZXQgb25seSBoaXRzCnNjcmVlbl9oaXRzX3NlbGVjdGVkIDwtIHNjcmVlbl9oaXRzW3doaWNoKHNjcmVlbl9oaXRzJGBHYW0gcGhlbm90eXBlIHNjcmVlbmAgPT0gIkJvdGgiIHwgc2NyZWVuX2hpdHMkYEdhbSBwaGVub3R5cGUgc2NyZWVuYCA9PSAiRmVtYWxlcyIgfCBzY3JlZW5faGl0cyRgR2FtIHBoZW5vdHlwZSBzY3JlZW5gID09ICJNYWxlcyIpLCBdIAoKIyMgZXh0cmFjdCBnZW5lIElEcwpnZW5lX2hpdHMgPC0gc2NyZWVuX2hpdHNfc2VsZWN0ZWQkYG5ldyBnZW5lIElEYAojIyBjaGFuZ2UgdGhlIHVuZGVyc2NvcmUgdG8gYSBkYXNoCmdlbmVfaGl0cyA8LSBnc3ViKCJfIiwgIi0iLCBnZW5lX2hpdHMpCgojIyBmaW5kIG91dCB3aGljaCBtb2R1bGVzIHRoZXkgYXJlIGluCmRmX2hpdHNfZ2VuZV9tb2R1bGVzIDwtIGdlbmVfbW9kdWxlX2RmX3NleFt3aGljaChnZW5lX21vZHVsZV9kZl9zZXgkaWQgJWluJSBnZW5lX2hpdHMpLF0KcHJpbnQoInNjcmVlbiBoaXRzIGJ5IG1vZHVsZSIpCnRhYmxlKGRmX2hpdHNfZ2VuZV9tb2R1bGVzJG1vZHVsZSkKCiMjIGdldCB0aGUgbnVtYmVyIGdlbmVzIHNjcmVlbmVkIGluIHRoYXQgbW9kdWxlCnNjcmVlbl9oaXRzX3NjcmVlbmVkIDwtIHNjcmVlbl9oaXRzW3doaWNoKHNjcmVlbl9oaXRzJGBHYW0gcGhlbm90eXBlIHNjcmVlbmAgPT0gIkJvdGgiIHwgc2NyZWVuX2hpdHMkYEdhbSBwaGVub3R5cGUgc2NyZWVuYCA9PSAiRmVtYWxlcyIgfCBzY3JlZW5faGl0cyRgR2FtIHBoZW5vdHlwZSBzY3JlZW5gID09ICJNYWxlcyIgfCBzY3JlZW5faGl0cyRgR2FtIHBoZW5vdHlwZSBzY3JlZW5gID09ICJOb25lIiB8IHNjcmVlbl9oaXRzJGBHYW0gcGhlbm90eXBlIHNjcmVlbmAgPT0gIm1hbGUgbm90IGVub3VnaCBwb3dlciIpLCBdIAojIyBleHRyYWN0IGdlbmUgSURzCmdlbmVzX3NjcmVlbmVkIDwtIHNjcmVlbl9oaXRzX3NjcmVlbmVkJGBuZXcgZ2VuZSBJRGAKIyMgY2hhbmdlIHRoZSB1bmRlcnNjb3JlIHRvIGEgZGFzaApnZW5lc19zY3JlZW5lZCA8LSBnc3ViKCJfIiwgIi0iLCBnZW5lc19zY3JlZW5lZCkKIyMgZmluZCBvdXQgd2hpY2ggbW9kdWxlcyB0aGV5IGFyZSBpbgpkZl9zY3JlZW5lZF9nZW5lX21vZHVsZXMgPC0gZ2VuZV9tb2R1bGVfZGZfc2V4W3doaWNoKGdlbmVfbW9kdWxlX2RmX3NleCRpZCAlaW4lIGdlbmVzX3NjcmVlbmVkKSxdCnByaW50KCJ0b3RhbCBnZW5lcyBzY3JlZW5lZCBpbiB0aGlzIG1vZHVsZSIpCnRhYmxlKGRmX3NjcmVlbmVkX2dlbmVfbW9kdWxlcyRtb2R1bGUpCgojIyBtYWtlIGEgdGFibGUgd2l0aCB0aGlzIGluZm8KcGNfc2NyZWVuZWQgPC0gZGF0YS5mcmFtZShoaXRzID0gdGFibGUoZGZfaGl0c19nZW5lX21vZHVsZXMkbW9kdWxlKSwgc2NyZWVuZWQgPSAgdGFibGUoZGZfc2NyZWVuZWRfZ2VuZV9tb2R1bGVzJG1vZHVsZSkpWywtM10KbmFtZXMocGNfc2NyZWVuZWQpIDwtIGMoIm1vZHVsZSIsICJoaXRzIiwgInNjcmVlbmVkIikKcGNfc2NyZWVuZWQkcGMgPC0gKHBjX3NjcmVlbmVkJGhpdHMgL3BjX3NjcmVlbmVkJHNjcmVlbmVkKSoxMDAKCiMjIHZpZXcKcGNfc2NyZWVuZWQKYGBgCkZ1cnRoZXIgaW52ZXN0aWdhdGlvbiBvZiBzY3JlZW4gaGl0cwpgYGB7cn0KIyMgcmVuYW1lIGRmCmRmX3NjcmVlbl9oaXRzX3NlbGVjdGVkIDwtIGFzLmRhdGEuZnJhbWUoc2NyZWVuX2hpdHNfc2VsZWN0ZWQpCmRmX3NjcmVlbl9oaXRzX3NlbGVjdGVkJCduZXcgZ2VuZSBJRCcgPC0gZ3N1YigiXyIsICItIiwgZGZfc2NyZWVuX2hpdHNfc2VsZWN0ZWQkJ25ldyBnZW5lIElEJykKbmFtZXMoZGZfc2NyZWVuX2hpdHNfc2VsZWN0ZWQpWzJdIDwtICJpZCIKZGZfZ2VuZV9tb2R1bGVfZGZfc2V4IDwtIGFzLmRhdGEuZnJhbWUoZ2VuZV9tb2R1bGVfZGZfc2V4KQoKIyMgbWVyZ2UgZGZzIHRvZ2V0aGVyCnNjcmVlbl9oaXRzX21vZHVsZXMgPC0gbWVyZ2UoZGZfc2NyZWVuX2hpdHNfc2VsZWN0ZWQsIGRmX2dlbmVfbW9kdWxlX2RmX3NleCwgYnkgPSAiaWQiKQoKIyMgdmlldwpzY3JlZW5faGl0c19tb2R1bGVzCmBgYAoKRE9aSS1yZWd1bGF0ZWQgZ2VuZXMKCkZpbmQgb3V0IGhvdyBtYW55IG9mIHRoZSBnZW5lcyBpbiBlYWNoIG1vZHVsZSBoYXMgYSBET1pJLXJlZ3VsYXRlZCBnZW5lCgpgYGB7cn0KRE9aSV9yZWd1bGF0ZWRfZ2VuZXMgPC0KcmVhZC5jc3YoZmlsZSA9ICIuLi9kYXRhL1JlZmVyZW5jZS9ET1pJX3JlZ3VsYXRlZF9nZW5lcy5jc3YiLCBoZWFkZXIgPSBUUlVFKQoKIyMgZXh0cmFjdCBnZW5lIElEcwpkb3ppX2dlbmVzIDwtIERPWklfcmVndWxhdGVkX2dlbmVzW0RPWklfcmVndWxhdGVkX2dlbmVzJERPWklfcmVndWxhdGVkLiA9PSAiWUVTIiwgXSRHZW5lX0lEX1BCCiMjIGNoYW5nZSB0aGUgdW5kZXJzY29yZSB0byBhIGRhc2gKZG96aV9nZW5lcyA8LSBnc3ViKCJfIiwgIi0iLCBkb3ppX2dlbmVzKQoKIyMgZmluZCBvdXQgd2hpY2ggbW9kdWxlcyB0aGV5IGFyZSBpbgpkZl9kb3ppX2dlbmVfbW9kdWxlcyA8LSBnZW5lX21vZHVsZV9kZl9zZXhbd2hpY2goZ2VuZV9tb2R1bGVfZGZfc2V4JGlkICVpbiUgZG96aV9nZW5lcyksXQpwcmludCgiZG96aSBnZW5lcyBieSBtb2R1bGUiKQp0YWJsZShkZl9kb3ppX2dlbmVfbW9kdWxlcyRtb2R1bGUpCmBgYAoKIyMjIyBWaXN1YWxpc2UgbW9kdWxlIGV4cHJlc3Npb24KCnBsb3Qgb3V0IG1vZHVsZXMKYGBge3IsIGZpZy5oZWlnaHQgPSA3LCBmaWcud2lkdGggPSA3fQojIyBtYWtlIGFnZ3JlZ2F0ZWQgZGYgYWdhaW4gc28geW91IGNhbiBlZGl0IGl0CmFnZ19tYXQgPC0gYWdncmVnYXRlX2dlbmVfZXhwcmVzc2lvbihtb25vY2xlLm9iamVjdCwgZ2VuZV9tb2R1bGVfZGZfc2V4LCBjZWxsX2dyb3VwX2RmKQoKIyMgaCBjbHVzdCB0aGUgYWdncmVnYXRlZCBtYXRyaXgKbW9kdWxlX2RlbmRybyA8LSBoY2x1c3QoZGlzdChhZ2dfbWF0KSkKCiMjIHVzZSB0aGVzZSBjbHVzdGVycyB0byByZW9yZGVyIHRoZSBtb2R1bGVzCmdlbmVfbW9kdWxlX2RmX3NleCRtb2R1bGUgPC0gZmFjdG9yKGdlbmVfbW9kdWxlX2RmX3NleCRtb2R1bGUsIGxldmVscyA9IHJvdy5uYW1lcyhhZ2dfbWF0KVttb2R1bGVfZGVuZHJvJG9yZGVyXSkKCiMjIHBsb3QKVU1BUF9tb2R1bGVzIDwtIHBsb3RfY2VsbHMobW9ub2NsZS5vYmplY3QsIGdlbmVzPWdlbmVfbW9kdWxlX2RmX3NleCAlPiUgZmlsdGVyKG1vZHVsZSAlaW4lIGMoMToyMCkpLAogICAgICAgICAgIGNlbGxfc2l6ZSA9IDIsIAogICAgICAgICAgIHggPSAyLCB5ID0gMSwKICAgICAgICAgICBsYWJlbF9jZWxsX2dyb3Vwcz1GQUxTRSwKICAgICAgICAgICBzY2FsZV90b19yYW5nZSA9IFRSVUUsCiAgICAgICAgICAgc2hvd190cmFqZWN0b3J5X2dyYXBoPUZBTFNFKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfY29sb3VyX3ZpcmlkaXNfYyhuYW1lID0gImV4cHJlc3Npb24iLCBvcHRpb24gPSAiQyIsIGFscGhhID0gMSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkX2ZpeGVkKCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lX3ZvaWQoKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpKQoKIyMgdmlldwpVTUFQX21vZHVsZXMKYGBgCnNhdmUKYGBge3J9Cmdnc2F2ZSgiLi4vaW1hZ2VzX3RvX2V4cG9ydC9HQ1NLT19zZXhicmFuY2hfdW1hcF9tb2R1bGVzLnBuZyIsIHBsb3QgPSBVTUFQX21vZHVsZXMsIGRldmljZSA9ICJwbmciLCBwYXRoID0gTlVMTCwgc2NhbGUgPSAxLCB3aWR0aCA9IDMwLCBoZWlnaHQgPSAzMCwgdW5pdHMgPSAiY20iLCBkcGkgPSAzMDAsIGxpbWl0c2l6ZSA9IFRSVUUpCmBgYAoKYGBge3J9CiMjIG1ha2UgYSBkYXRhZnJhbWUgb2YgZ2VuZXMgcGVyIG1vZHVsZQpnZW5lc19wZXJfbW9kdWxlIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoZ2VuZV9tb2R1bGVfZGZfc2V4JG1vZHVsZSkpCgojIyBpbnNwZWN0CmdlbmVzX3Blcl9tb2R1bGUKYGBgCgpgYGB7ciwgZmlnLmhlaWdodCA9IDgsIGZpZy53aWR0aCA9IDEyfQojIyBBLiBQcmVwYXJhdGlvbiBvZiBkYXRhZnJhbWUKCiMjIHByZXBhcmUgY3VzdG9tIGRhdGFmcmFtZSBmb3IgYWxsIGNlbGxzIGJ5IG1vZHVsZXM6CmFnZ19tYXRfbm9fZ3JvdXAgPC0gYWdncmVnYXRlX2dlbmVfZXhwcmVzc2lvbihtb25vY2xlLm9iamVjdCwgZ2VuZV9tb2R1bGVfZGZfc2V4LCBzY2FsZV9hZ2dfdmFsdWVzID0gVFJVRSkKCiMjIEIuIGFubm90YXRpb25zCgojIyBtYWtlIGFuIGFub3RhdGlvbgojIyBhZGQgcHQgdG8gdGhlIG1vbm9jbGUgb2JqZWN0Cm1vbm9jbGUub2JqZWN0QGNvbERhdGEkcHQgPC0gYXMuZGF0YS5mcmFtZShwc2V1ZG90aW1lKG1vbm9jbGUub2JqZWN0LCByZWR1Y3Rpb25fbWV0aG9kID0gIlVNQVAiKSkKIyMgbWFrZSBhbiBhbm5vdGF0aW9uIGRhdGFmcmFtZQphbm5vX25vX2dyb3VwIDwtIGRhdGEuZnJhbWUobW9ub2NsZS5vYmplY3RAY29sRGF0YSRjbHVzdGVyX2NvbG91cnNfZmlndXJlLCBtb25vY2xlLm9iamVjdEBjb2xEYXRhJHB0LCBhcy5mYWN0b3IobW9ub2NsZS5vYmplY3RAY29sRGF0YSRQcmVkaWN0aW9uLlNwZWFybWFuLl9LYXNpYSksIHJvdy5uYW1lcyA9IHJvd25hbWVzKG1vbm9jbGUub2JqZWN0QGNvbERhdGEpKQpuYW1lcyhhbm5vX25vX2dyb3VwKSA8LSBjKCJTZXgiLCAiUHNldWRvdGltZSIsICJSZWFsX3RpbWVfcHJlZGljdGlvbiIpCgojIyBtYWtlIGFubm90YXRpb24gY29sb3Vycwphbm5vdGF0aW9uX2NvbG91cnMgPC0gbGlzdChTZXggPSBjKE1hbGU9IiMwMTZjMDAiLCBGZW1hbGU9IiNhNTJiMWUiLCBCaXBvdGVudGlhbCA9ICIjZmZlNDAwIiwgQXNleHVhbCA9ICIjMDA1MmM1IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFBzZXVkb3RpbWUgPSBwbGFzbWEoMTIsIGRpcmVjdGlvbiA9IDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFsX3RpbWVfcHJlZGljdGlvbiA9IGMoIjAiID0gdmlyaWRpcyg4LCBkaXJlY3Rpb24gPSAxKVsxXSAsIjEiID0gIHZpcmlkaXMoOCwgZGlyZWN0aW9uID0gMSlbMl0gLCI0IiA9IHZpcmlkaXMoOCwgZGlyZWN0aW9uID0gMSlbM10gLCI2IiA9IHZpcmlkaXMoOCwgZGlyZWN0aW9uID0gMSlbNF0gLCI4IiA9IHZpcmlkaXMoOCwgZGlyZWN0aW9uID0gMSlbNV0gICwiMTIiICA9IHZpcmlkaXMoOCwgZGlyZWN0aW9uID0gMSlbNl0gICwiMTgiID0gdmlyaWRpcyg4LCBkaXJlY3Rpb24gPSAxKVs3XSAgLCIyNCIgPSB2aXJpZGlzKDgsIGRpcmVjdGlvbiA9IDEpWzhdKSkKCiMjIGNoYW5nZSB0aGUgb3JkZXIgb2YgdGhlIGNvbHMgKGNlbGxzKSBpbiBkYXRhIGZyYW1lCmNvbC5vcmRlciA8LSByb3duYW1lcyhhbm5vX25vX2dyb3VwW3dpdGgoYW5ub19ub19ncm91cCwgb3JkZXIoU2V4LCBQc2V1ZG90aW1lKSksIF0pCmFnZ19tYXRfbm9fZ3JvdXAgPC0gYWdnX21hdF9ub19ncm91cFssY29sLm9yZGVyXQoKIyMgcmVvcmRlciB0aGUgcm93cyAoZ2VuZSBtb2R1bGVzKSBpbiB0aGUgZGF0YSBmcmFtZSBzbyB0aGV5IGFyZSBpbiBwdCBvcmRlcgojIyBkZWZpbmUgdGhlIG9yZGVyIHZpc3VhbGx5IGFuZCB1c2luZyB0aGUgY2x1c3RlcnMgb3JpZ2luYWxseSBwcm9kdWNlZApyb3cub3JkZXIgPC0gYygiOCIsICIzIiwiNCIsICIxNSIsICIyIiwgIjE4IiwgIjExIiwKICAgICAgICAgICAgICAgIjciLCAiMSIsICIxMyIsCiAgICAgICAgICAgICAgICIxMCIsICIxNCIsICIxMiIsICIxNiIsICI5IiwKICAgICAgICAgICAgICAgIjUiLCI2IiwgIjE3IiwKICAgICAgICAgICAgICAgIjE5IiwgIjIwIikKIyMgcmVvcmRlciB1c2luZyBuZXcgb3JkZXIKYWdnX21hdF9ub19ncm91cCA8LSBhZ2dfbWF0X25vX2dyb3VwW3Jvdy5vcmRlciwgXQoKIyMgZm9yIGN1dHMgaW4gY29sdW1ucyAtIHVzZWQgbGF0ZXIgdG8gY291bnQgbnVtYmVyIG9mIGNlbGxzIGluIGVhY2ggY2F0CmRmX21ldGEgPC0gYXMuZGF0YS5mcmFtZShtb25vY2xlLm9iamVjdEBjb2xEYXRhKQpmZW1hbGVfY2VsbHMgPC0gcm93bmFtZXMoZGZfbWV0YVt3aGljaChkZl9tZXRhJGNsdXN0ZXJfY29sb3Vyc19maWd1cmUgPT0gIkZlbWFsZSIpLCBdKQptYWxlX2NlbGxzIDwtIHJvd25hbWVzKGRmX21ldGFbd2hpY2goZGZfbWV0YSRjbHVzdGVyX2NvbG91cnNfZmlndXJlID09ICJNYWxlIiksIF0pCmJpX2NlbGxzIDwtIHJvd25hbWVzKGRmX21ldGFbd2hpY2goZGZfbWV0YSRjbHVzdGVyX2NvbG91cnNfZmlndXJlID09ICJCaXBvdGVudGlhbCIpLCBdKQphc2V4X2NlbGxzIDwtIHJvd25hbWVzKGRmX21ldGFbd2hpY2goZGZfbWV0YSRjbHVzdGVyX2NvbG91cnNfZmlndXJlID09ICJBc2V4dWFsIiksIF0pCnJtKGRmX21ldGEpCgojIyBhZGQgbW9kdWxlIGFuZCB0aGUgbnVtYmVyIG9mIGNlbGxzIHRvIHRoZSByb3cKIyMgY2hhbmdlIG5hbWVzIGZvciByb3cgbmFtZXMgdG8gaW5jbHVkZSAibW9kdWxlICIgYXQgdGhlIGJlZ2luaW5nIG9mIHRoZW0KbGFiZWxzLnJvdyA8LSBzdHJpbmdyOjpzdHJfYygiTW9kdWxlICIsIHJvdy5uYW1lcyhhZ2dfbWF0X25vX2dyb3VwKSkKIyMgcmVvcmRlciBmcmVxdWVuY3kgc28gdGhhdCBpdCBpcyBtYXRjaGluZyBvdXIgbWF0cml4CmdlbmVzX3Blcl9tb2R1bGVfb3JkZXJlZCA8LSBnZW5lc19wZXJfbW9kdWxlW21hdGNoKHJvdy5uYW1lcyhhZ2dfbWF0X25vX2dyb3VwKSwgZ2VuZXNfcGVyX21vZHVsZSRWYXIxKSwgXQojIyBhZGQgbnVtYmVyIG9mIGNlbGxzIHRvIHRoZSByb3duYW1lcyBmb3IgdGhlIG1vZHVsZQpmb3IoaSBpbiBzZXFfYWxvbmcoZ2VuZXNfcGVyX21vZHVsZV9vcmRlcmVkJEZyZXEpKXsKICBsYWJlbHMucm93W2ldIDwtIHN0cmluZ3I6OnN0cl9jKGxhYmVscy5yb3dbaV0sIiAobiA9ICIgLGdlbmVzX3Blcl9tb2R1bGVfb3JkZXJlZCRGcmVxW2ldLCAiKSIpCn0KCiMjIEMuIFBsb3R0aW5nCgojIyBwbG90CmhlYXRtYXBfbWFpbiA8LSBwaGVhdG1hcDo6cGhlYXRtYXAoYWdnX21hdF9ub19ncm91cCwgCiAgICAgICAgICAgICAgICAgICAjc2NhbGU9InJvdyIsCiAgICAgICAgICAgICAgICAgICBjbHVzdGVyX2NvbHMgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgIyMgb3RoZXJzOiB3YXJkLkQyLAogICAgICAgICAgICAgICAgICAgI2NsdXN0ZXJpbmdfbWV0aG9kPSJjb21wbGV0ZSIsCiAgICAgICAgICAgICAgICAgICBzaG93X2NvbG5hbWVzID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICBsYWJlbHNfcm93ID0gbGFiZWxzLnJvdywKICAgICAgICAgICAgICAgICAgIGZvbnRzaXplX3JvdyA9IDE1LAogICAgICAgICAgICAgICAgICAgZm9udHNpemUgPSAxNSwKICAgICAgICAgICAgICAgICAgIGdhcHNfY29sID0gYyhsZW5ndGgoYXNleF9jZWxscyksIGxlbmd0aChjKGFzZXhfY2VsbHMsYmlfY2VsbHMpKSwgbGVuZ3RoKGMoYXNleF9jZWxscyxiaV9jZWxscyxmZW1hbGVfY2VsbHMpKSksCiAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uX2NvbCA9IGFubm9fbm9fZ3JvdXAsIAogICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbl9jb2xvcnMgPSBhbm5vdGF0aW9uX2NvbG91cnMsIAogICAgICAgICAgICAgICAgICAgY3V0cmVlX3Jvd3MgPSA2KQoKIyMgdmlldwpoZWF0bWFwX21haW4KYGBgCnNhdmUKYGBge3J9Cmdnc2F2ZSgiLi4vaW1hZ2VzX3RvX2V4cG9ydC9HQ1NLT19zZXhicmFuY2hfaGVhdG1hcC5wbmciLCBwbG90ID0gaGVhdG1hcF9tYWluLCBkZXZpY2UgPSAicG5nIiwgcGF0aCA9IE5VTEwsIHNjYWxlID0gMSwgd2lkdGggPSAyNywgaGVpZ2h0ID0gMjAsIHVuaXRzID0gImNtIiwgZHBpID0gMzAwLCBsaW1pdHNpemUgPSBUUlVFKQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0ID0gOCwgZmlnLndpZHRoID0gMTJ9CiMjIEEuIFByZXBhcmF0aW9uIG9mIGRhdGFmcmFtZQoKIyMgcHJlcGFyZSBjdXN0b20gZGF0YWZyYW1lIGZvciBhbGwgY2VsbHMgYnkgbW9kdWxlczoKYWdnX21hdF9ub19ncm91cCA8LSBhZ2dyZWdhdGVfZ2VuZV9leHByZXNzaW9uKG1vbm9jbGUub2JqZWN0LCBnZW5lX21vZHVsZV9kZl9zZXgsIHNjYWxlX2FnZ192YWx1ZXMgPSBUUlVFKQoKIyMgQi4gYW5ub3RhdGlvbnMKCiMjIG1ha2UgYW4gYW5vdGF0aW9uCiMjIGFkZCBwdCB0byB0aGUgbW9ub2NsZSBvYmplY3QKbW9ub2NsZS5vYmplY3RAY29sRGF0YSRwdCA8LSBhcy5kYXRhLmZyYW1lKHBzZXVkb3RpbWUobW9ub2NsZS5vYmplY3QsIHJlZHVjdGlvbl9tZXRob2QgPSAiVU1BUCIpKQojIyBtYWtlIGFuIGFubm90YXRpb24gZGF0YWZyYW1lCmFubm9fbm9fZ3JvdXAgPC0gZGF0YS5mcmFtZShtb25vY2xlLm9iamVjdEBjb2xEYXRhJFNleGVzX21vbm9jbGUsIG1vbm9jbGUub2JqZWN0QGNvbERhdGEkY2x1c3Rlcl9jb2xvdXJzX2ZpZ3VyZSwgbW9ub2NsZS5vYmplY3RAY29sRGF0YSRwdCwgYXMuZmFjdG9yKG1vbm9jbGUub2JqZWN0QGNvbERhdGEkUHJlZGljdGlvbi5TcGVhcm1hbi5fS2FzaWEpLCByb3cubmFtZXMgPSByb3duYW1lcyhtb25vY2xlLm9iamVjdEBjb2xEYXRhKSkKIyMgYWRkIG5hbWVzIHRvIHRoaXMgZGF0YWZyYW1lCm5hbWVzKGFubm9fbm9fZ3JvdXApIDwtIGMoIlNleGVzX21vbm9jbGUiLCAiU2V4IiwgIlBzZXVkb3RpbWUiLCAiUmVhbF90aW1lX3ByZWRpY3Rpb24iKQojIyBtYWtlIHRoZSBzZXhlcyBjbGFzc2lmaWNhdGlvbiBhIGZhY3RvciBzbyBpdCBjYW4gYmUgcmVvcmRlcmVkIChleHBsYWluYXRpb24gaGVyZTogaHR0cHM6Ly9yc3R1ZGlvLXB1YnMtc3RhdGljLnMzLmFtYXpvbmF3cy5jb20vNzQzM180NTM3ZWE1MDczZGM0MTYyOTUwYWJiNzE1ZjUxMzQ2OS5odG1sKQphbm5vX25vX2dyb3VwJFNleGVzX21vbm9jbGUgPC0gZmFjdG9yKGFubm9fbm9fZ3JvdXAkU2V4ZXNfbW9ub2NsZSwgbGV2ZWxzID0gYygiQXNleHVhbCIsICJVbmFzc2lnbmVkIiwgIkFzZXh1YWxfRmF0ZSIsICJCaXBvdGVudGlhbCIsICJGZW1hbGUiLCAiTWFsZSIpKQoKIyMgbWFrZSBhbm5vdGF0aW9uIGNvbG91cnMKYW5ub3RhdGlvbl9jb2xvdXJzIDwtIGxpc3QoU2V4ZXNfbW9ub2NsZSA9IGMoTWFsZT0iIzAxNmMwMCIsIEZlbWFsZT0iI2E1MmIxZSIsIEJpcG90ZW50aWFsID0gIiNmZmU0MDAiLCBBc2V4dWFsID0gIiMwMDUyYzUiLCBBc2V4dWFsX0ZhdGUgPSAiIzc3QTlEOCIsIFVuYXNzaWduZWQgPSAiIzAwNTJjNSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBTZXggPSBjKE1hbGU9IiMwMTZjMDAiLCBGZW1hbGU9IiNhNTJiMWUiLCBCaXBvdGVudGlhbCA9ICIjZmZlNDAwIiwgQXNleHVhbCA9ICIjMDA1MmM1IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFBzZXVkb3RpbWUgPSBwbGFzbWEoMTIsIGRpcmVjdGlvbiA9IDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFsX3RpbWVfcHJlZGljdGlvbiA9IGMoIjAiID0gdmlyaWRpcyg4LCBkaXJlY3Rpb24gPSAxKVsxXSAsIjEiID0gIHZpcmlkaXMoOCwgZGlyZWN0aW9uID0gMSlbMl0gLCI0IiA9IHZpcmlkaXMoOCwgZGlyZWN0aW9uID0gMSlbM10gLCI2IiA9IHZpcmlkaXMoOCwgZGlyZWN0aW9uID0gMSlbNF0gLCI4IiA9IHZpcmlkaXMoOCwgZGlyZWN0aW9uID0gMSlbNV0gICwiMTIiICA9IHZpcmlkaXMoOCwgZGlyZWN0aW9uID0gMSlbNl0gICwiMTgiID0gdmlyaWRpcyg4LCBkaXJlY3Rpb24gPSAxKVs3XSAgLCIyNCIgPSB2aXJpZGlzKDgsIGRpcmVjdGlvbiA9IDEpWzhdKSkKCiMjIGNoYW5nZSB0aGUgb3JkZXIgb2YgdGhlIGNvbHMgKGNlbGxzKSBpbiBkYXRhIGZyYW1lCmNvbC5vcmRlciA8LSByb3duYW1lcyhhbm5vX25vX2dyb3VwW3dpdGgoYW5ub19ub19ncm91cCwgb3JkZXIoU2V4ZXNfbW9ub2NsZSwgUHNldWRvdGltZSkpLCBdKQphZ2dfbWF0X25vX2dyb3VwIDwtIGFnZ19tYXRfbm9fZ3JvdXBbLGNvbC5vcmRlcl0KCiMjIHJlb3JkZXIgdGhlIHJvd3MgKGdlbmUgbW9kdWxlcykgaW4gdGhlIGRhdGEgZnJhbWUgc28gdGhleSBhcmUgaW4gcHQgb3JkZXIKIyMgZGVmaW5lIHRoZSBvcmRlciB2aXN1YWxseSBhbmQgdXNpbmcgdGhlIGNsdXN0ZXJzIG9yaWdpbmFsbHkgcHJvZHVjZWQKcm93Lm9yZGVyIDwtIGMoIjgiLCAiMyIsIjQiLCAiMTUiLCAiMiIsICIxOCIsICIxMSIsCiAgICAgICAgICAgICAgICI3IiwgIjEiLCAiMTMiLAogICAgICAgICAgICAgICAiMTAiLCAiMTQiLCAiMTIiLCAiMTYiLCAiOSIsCiAgICAgICAgICAgICAgICI1IiwiNiIsICIxNyIsCiAgICAgICAgICAgICAgICIxOSIsICIyMCIpCiMjIHJlb3JkZXIgdXNpbmcgbmV3IG9yZGVyCmFnZ19tYXRfbm9fZ3JvdXAgPC0gYWdnX21hdF9ub19ncm91cFtyb3cub3JkZXIsIF0KCiMjIGZvciBjdXRzIGluIGNvbHVtbnMgLSB1c2VkIGxhdGVyIHRvIGNvdW50IG51bWJlciBvZiBjZWxscyBpbiBlYWNoIGNhdApkZl9tZXRhIDwtIGFzLmRhdGEuZnJhbWUobW9ub2NsZS5vYmplY3RAY29sRGF0YSkKZmVtYWxlX2NlbGxzIDwtIHJvd25hbWVzKGRmX21ldGFbd2hpY2goZGZfbWV0YSRTZXhlc19tb25vY2xlID09ICJGZW1hbGUiKSwgXSkKbWFsZV9jZWxscyA8LSByb3duYW1lcyhkZl9tZXRhW3doaWNoKGRmX21ldGEkU2V4ZXNfbW9ub2NsZSA9PSAiTWFsZSIpLCBdKQpiaV9jZWxscyA8LSByb3duYW1lcyhkZl9tZXRhW3doaWNoKGRmX21ldGEkU2V4ZXNfbW9ub2NsZSA9PSAiQmlwb3RlbnRpYWwiKSwgXSkKYXNleF9jZWxscyA8LSByb3duYW1lcyhkZl9tZXRhW3doaWNoKGRmX21ldGEkU2V4ZXNfbW9ub2NsZSA9PSAiQXNleHVhbCIpLCBdKQphc2V4X2ZhdGVfY2VsbHMgPC0gcm93bmFtZXMoZGZfbWV0YVt3aGljaChkZl9tZXRhJFNleGVzX21vbm9jbGUgPT0gIkFzZXh1YWxfRmF0ZSIpLCBdKQp1bmFzc2lnbmVkX2NlbGxzIDwtIHJvd25hbWVzKGRmX21ldGFbd2hpY2goZGZfbWV0YSRTZXhlc19tb25vY2xlID09ICJVbmFzc2lnbmVkIiksIF0pCnJtKGRmX21ldGEpCgojIyBhZGQgbW9kdWxlIGFuZCB0aGUgbnVtYmVyIG9mIGNlbGxzIHRvIHRoZSByb3cKIyMgY2hhbmdlIG5hbWVzIGZvciByb3cgbmFtZXMgdG8gaW5jbHVkZSAibW9kdWxlICIgYXQgdGhlIGJlZ2luaW5nIG9mIHRoZW0KbGFiZWxzLnJvdyA8LSBzdHJpbmdyOjpzdHJfYygiTW9kdWxlICIsIHJvdy5uYW1lcyhhZ2dfbWF0X25vX2dyb3VwKSkKIyMgcmVvcmRlciBmcmVxdWVuY3kgc28gdGhhdCBpdCBpcyBtYXRjaGluZyBvdXIgbWF0cml4CmdlbmVzX3Blcl9tb2R1bGVfb3JkZXJlZCA8LSBnZW5lc19wZXJfbW9kdWxlW21hdGNoKHJvdy5uYW1lcyhhZ2dfbWF0X25vX2dyb3VwKSwgZ2VuZXNfcGVyX21vZHVsZSRWYXIxKSwgXQojIyBhZGQgbnVtYmVyIG9mIGNlbGxzIHRvIHRoZSByb3duYW1lcyBmb3IgdGhlIG1vZHVsZQpmb3IoaSBpbiBzZXFfYWxvbmcoZ2VuZXNfcGVyX21vZHVsZV9vcmRlcmVkJEZyZXEpKXsKICBsYWJlbHMucm93W2ldIDwtIHN0cmluZ3I6OnN0cl9jKGxhYmVscy5yb3dbaV0sIiAobiA9ICIgLGdlbmVzX3Blcl9tb2R1bGVfb3JkZXJlZCRGcmVxW2ldLCAiKSIpCn0KCiMjIEMuIFBsb3R0aW5nCgojIyBwbG90CmhlYXRtYXBfbWFpbiA8LSBwaGVhdG1hcDo6cGhlYXRtYXAoYWdnX21hdF9ub19ncm91cCwgCiAgICAgICAgICAgICAgICAgICAjc2NhbGU9InJvdyIsCiAgICAgICAgICAgICAgICAgICBjbHVzdGVyX2NvbHMgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJfcm93cyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAjIyBvdGhlcnM6IHdhcmQuRDIsCiAgICAgICAgICAgICAgICAgICAjY2x1c3RlcmluZ19tZXRob2Q9ImNvbXBsZXRlIiwKICAgICAgICAgICAgICAgICAgIHNob3dfY29sbmFtZXMgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgIGxhYmVsc19yb3cgPSBsYWJlbHMucm93LAogICAgICAgICAgICAgICAgICAgZm9udHNpemVfcm93ID0gMTUsCiAgICAgICAgICAgICAgICAgICBmb250c2l6ZSA9IDE1LAogICAgICAgICAgICAgICAgICAgZ2Fwc19jb2wgPSBjKGxlbmd0aChhc2V4X2NlbGxzKSwgbGVuZ3RoKGMoYXNleF9jZWxscyx1bmFzc2lnbmVkX2NlbGxzKSksIGxlbmd0aChjKGFzZXhfY2VsbHMsdW5hc3NpZ25lZF9jZWxscywgYXNleF9mYXRlX2NlbGxzKSksIGxlbmd0aChjKGFzZXhfY2VsbHMsdW5hc3NpZ25lZF9jZWxscywgYXNleF9mYXRlX2NlbGxzLGJpX2NlbGxzKSksIGxlbmd0aChjKGFzZXhfY2VsbHMsdW5hc3NpZ25lZF9jZWxscywgYXNleF9mYXRlX2NlbGxzLGJpX2NlbGxzLCBmZW1hbGVfY2VsbHMpKSwgbGVuZ3RoKGMoYXNleF9jZWxscyx1bmFzc2lnbmVkX2NlbGxzLCBhc2V4X2ZhdGVfY2VsbHMsYmlfY2VsbHMsIGZlbWFsZV9jZWxscywgbWFsZV9jZWxscykpKSwKICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25fY29sID0gYW5ub19ub19ncm91cCwgCiAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uX2NvbG9ycyA9IGFubm90YXRpb25fY29sb3VycywgCiAgICAgICAgICAgICAgICAgICBjdXRyZWVfcm93cyA9IDYpCgojIyB2aWV3CmhlYXRtYXBfbWFpbgpgYGAKCgoKCgpUaGlzIGlzIGZvcjoKYGBge3J9CiMjIHJlcGVhdCBvZiBwbG90IGFib3ZlOgojIyBQbG90CnVtYXBfcHQgPC0gcGxvdF9jZWxscyhtb25vY2xlLm9iamVjdCwgY29sb3JfY2VsbHNfYnkgPSAicHNldWRvdGltZSIsIGxhYmVsX2NlbGxfZ3JvdXBzPUZBTFNFLCBjZWxsX3NpemUgPSAxLCB4ID0gMiwgeSA9IDEsIGxhYmVsX2JyYW5jaF9wb2ludHM9RkFMU0UsIGxhYmVsX2xlYXZlcz1GQUxTRSwgbGFiZWxfZ3JvdXBzX2J5X2NsdXN0ZXI9RkFMU0UsIGxhYmVsX3Jvb3RzID0gRkFMU0UpICsKICBjb29yZF9maXhlZCgpICsKICB0aGVtZV92b2lkKCkgKwogIGxhYnModGl0bGUgPSAiUHNldWRvdGltZSIpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKCiMjIHZpZXcKdW1hcF9wdApgYGAKCgojIyMjIFZpc3VhbGlzZSB0aGUgZXhwcmVzc2lvbiBvZiBzZWxlY3QgZ2VuZXMgb3ZlciBwc2V1ZG90aW1lCgpgYGB7ciwgZmlnLmhlaWdodCA9IDgsIGZpZy53aWR0aCA9IDEwfQojIyBsYW5kbWFyayBnZW5lcyAoZ2VuZXMgb2YgaW50ZXJlc3QpCiMgQVAyRyAtIFBCQU5LQS0xNDM3NTAwCiMgQVAyIC0gUEJBTktBLTA5MDk2MDAgLSBmcm9tIHBvcmFuIHBhcGVyCiMgQVAyRy0yIC0gUEJBTktBLTEwMzQzMDAgCiNsaXN0X29mX211dGFudF9nZW5lcyA8LSBjKCJQQkFOS0EtMDgyODAwMCIsICJQQkFOS0EtMTMwMjcwMCIsICJQQkFOS0EtMTQ0NzkwMCIsICJQQkFOS0EtMDEwMjQwMCIsICJQQkFOS0EtMDcxNjUwMCIsICJQQkFOS0EtMTQzNTIwMCIsICJQQkFOS0EtMTQxODEwMCIsICJQQkFOS0EtMTE0NDgwMCIsICJQQkFOS0EtMDkwMjMwMCIsICJQQkFOS0EtMDQxMzQwMCIsICJQQkFOS0EtMTQ1NDgwMCIpCgojIyBkZWZpbmUgZ2VuZXMgdG8gcGxvdApsaXN0X29mX2dlbmVzX29mX2ludGVyZXN0IDwtIGMoIlBCQU5LQS0wMTAyNDAwIiwgIlBCQU5LQS0wNDEzNDAwIiwgIlBCQU5LQS0wNzE2NTAwIiwgIlBCQU5LQS0wODI4MDAwIiwgIlBCQU5LQS0wOTAyMzAwIiwgIlBCQU5LQS0xMTQ0ODAwIiwgIlBCQU5LQS0xMzAyNzAwIiwgIlBCQU5LQS0xNDE4MTAwIiwgIlBCQU5LQS0xNDM1MjAwIiwgIlBCQU5LQS0xNDQ3OTAwIiwgIlBCQU5LQS0xNDU0ODAwIiwgIlBCQU5LQS0xNDM3NTAwIiwgIlBCQU5LQS0xMzE5NTAwIiwgIlBCQU5LQS0wNDE2MTAwIiwgIlBCQU5LQS0xMDM0MzAwIikKIyMgYWRkIG5hbWVzCm5hbWVzX29mX2dlbmVzX29mX2ludGVyZXN0IDwtIGMoIkdDU0tPLTIiLCAiR0NTS08tMTAiLCAiR0NTS08tMTkiLCAiR0NTS08tMyIsICJHQ1NLTy0xMyIsICJHQ1NLTy0yOCIsICJHQ1NLTy1vb20iLCAiR0NTS08tMTciLCAiR0NTS08tMjAiLCAiR0NTS08tMjkiLCAiR0NTS08tMjEiLCAiQVAyLUciLCAiQ0NQMiIsICJNRzEiLCAiQVAyLUcyIikKCiMjbWFrZSBkZiBmb3IgZ2VuZXMgb2YgaW50ZXJlc3QKZ2VuZXNfb2ZfaW50ZXJlc3QgPC0gZGF0YS5mcmFtZShnZW5lID0gbGlzdF9vZl9nZW5lc19vZl9pbnRlcmVzdCwgZ3JvdXAgPSBjKDE6bGVuZ3RoKGxpc3Rfb2ZfZ2VuZXNfb2ZfaW50ZXJlc3QpKSwgbmFtZSA9IG5hbWVzX29mX2dlbmVzX29mX2ludGVyZXN0KQojIyByZW9yZGVyCiNnZW5lc19vZl9pbnRlcmVzdCA8LSBnZW5lc19vZl9pbnRlcmVzdFttYXRjaChjKCJBUDItRyIsICJDQ1AyIiwgIkdDU0tPLTIxIiwgIkdDU0tPLTE3IiwgIkdDU0tPLTIiLCAiTUcxIiwgIkdDU0tPLTIwIiwgIkdDU0tPLTMiLCAiR0NTS08tb29tIiwgIkdDU0tPLTI5IiwgIkdDU0tPLTEwIiwgIkdDU0tPLTI4IiwgIkdDU0tPLTE5IiwgIkdDU0tPLTEzIiksIGdlbmVzX29mX2ludGVyZXN0JG5hbWUpLCBdCgojIyBwcmVwYXJlIGN1c3RvbSBkYXRhZnJhbWUgZm9yIGFsbCBjZWxscyBieSBtb2R1bGVzOgphZ2dfbWF0X2dlbmVzX29mX2ludGVyZXN0IDwtIGFnZ3JlZ2F0ZV9nZW5lX2V4cHJlc3Npb24obW9ub2NsZS5vYmplY3QsIGdlbmVzX29mX2ludGVyZXN0WywxOjJdKQoKIyMgcmVvcmRlciB1c2luZyBuZXcgb3JkZXIKYWdnX21hdF9nZW5lc19vZl9pbnRlcmVzdCA8LSBhZ2dfbWF0X2dlbmVzX29mX2ludGVyZXN0Wyxjb2wub3JkZXJdCgojIyBwbG90CmhlYXRtYXBfcGxvdCA8LSBwaGVhdG1hcDo6cGhlYXRtYXAoYWdnX21hdF9nZW5lc19vZl9pbnRlcmVzdCwgCiAgICAgICAgICAgICAgICAgICAjc2NhbGU9InJvdyIsCiAgICAgICAgICAgICAgICAgICBjbHVzdGVyX2NvbHMgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJfcm93cyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICBjbHVzdGVyaW5nX21ldGhvZD0id2FyZC5EMiIsCiAgICAgICAgICAgICAgICAgICBzaG93X2NvbG5hbWVzID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICBsYWJlbHNfcm93ID0gYXMuY2hhcmFjdGVyKGdlbmVzX29mX2ludGVyZXN0WywzXSksCiAgICAgICAgICAgICAgICAgICBnYXBzX2NvbCA9IGMobGVuZ3RoKGFzZXhfY2VsbHMpLCBsZW5ndGgoYyhhc2V4X2NlbGxzLGJpX2NlbGxzKSksIGxlbmd0aChjKGFzZXhfY2VsbHMsYmlfY2VsbHMsZmVtYWxlX2NlbGxzKSkpLAogICAgICAgICAgICAgICAgICAgI2dhcHNfcm93ID0gYygxLCA2KSwKICAgICAgICAgICAgICAgICAgIGN1dHJlZV9yb3dzID0gMiwKICAgICAgICAgICAgICAgICAgICMjIHRyeWluZyB0byBmaXggbGVnZW5kIGlzc3VlIGhlcmUKICAgICAgICAgICAgICAgICAgICNmb250c2l6ZV9yb3cgPSAxMCwKICAgICAgICAgICAgICAgICAgICNmb250c2l6ZV9jb2wgPSAzLAogICAgICAgICAgICAgICAgICAgI2NlbGxoZWlnaHQ9MywgCiAgICAgICAgICAgICAgICAgICAjY2VsbHdpZHRoID0gMywKICAgICAgICAgICAgICAgICAgIGxlZ2VuZCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uX2xlZ2VuZCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbl9jb2wgPSBhbm5vX25vX2dyb3VwLCAKICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25fY29sb3JzID0gYW5ub3RhdGlvbl9jb2xvdXJzCiAgICAgICAgICAgICAgICAgICApCgpoZWF0bWFwX3Bsb3QKYGBgCgpsb29rIGF0IHNvbWUgb2YgdGhlICJtb2R1bGUiIGdlbmVzIG5vdyB0b28KCmBgYHtyLCBmaWcuaGVpZ2h0ID0gOCwgZmlnLndpZHRoID0gMTB9CiMjIGxhbmRtYXJrIGdlbmVzIChnZW5lcyBvZiBpbnRlcmVzdCkKIyBBUDJHIC0gUEJBTktBLTE0Mzc1MDAKIyBBUDIgLSBQQkFOS0EtMDkwOTYwMCAtIGZyb20gcG9yYW4gcGFwZXIKIyBBUDJHLTIgLSBQQkFOS0EtMTAzNDMwMCAKI2xpc3Rfb2ZfbXV0YW50X2dlbmVzIDwtIGMoIlBCQU5LQS0wODI4MDAwIiwgIlBCQU5LQS0xMzAyNzAwIiwgIlBCQU5LQS0xNDQ3OTAwIiwgIlBCQU5LQS0wMTAyNDAwIiwgIlBCQU5LQS0wNzE2NTAwIiwgIlBCQU5LQS0xNDM1MjAwIiwgIlBCQU5LQS0xNDE4MTAwIiwgIlBCQU5LQS0xMTQ0ODAwIiwgIlBCQU5LQS0wOTAyMzAwIiwgIlBCQU5LQS0wNDEzNDAwIiwgIlBCQU5LQS0xNDU0ODAwIikKCiMjIGRlZmluZSBnZW5lcyB0byBwbG90Cmxpc3Rfb2ZfZ2VuZXNfb2ZfaW50ZXJlc3QgPC0gYygiUEJBTktBLTE0NTQwMDAiLCAiUEJBTktBLTEzNTQwMDAiKQojIyBhZGQgbmFtZXMKbmFtZXNfb2ZfZ2VuZXNfb2ZfaW50ZXJlc3QgPC0gYygiR3lyQiIsICJEQlIxIikKCiMjbWFrZSBkZiBmb3IgZ2VuZXMgb2YgaW50ZXJlc3QKZ2VuZXNfb2ZfaW50ZXJlc3QgPC0gZGF0YS5mcmFtZShnZW5lID0gbGlzdF9vZl9nZW5lc19vZl9pbnRlcmVzdCwgZ3JvdXAgPSBjKDE6bGVuZ3RoKGxpc3Rfb2ZfZ2VuZXNfb2ZfaW50ZXJlc3QpKSwgbmFtZSA9IG5hbWVzX29mX2dlbmVzX29mX2ludGVyZXN0KQojIyByZW9yZGVyCiNnZW5lc19vZl9pbnRlcmVzdCA8LSBnZW5lc19vZl9pbnRlcmVzdFttYXRjaChjKCJBUDItRyIsICJDQ1AyIiwgIkdDU0tPLTIxIiwgIkdDU0tPLTE3IiwgIkdDU0tPLTIiLCAiTUcxIiwgIkdDU0tPLTIwIiwgIkdDU0tPLTMiLCAiR0NTS08tb29tIiwgIkdDU0tPLTI5IiwgIkdDU0tPLTEwIiwgIkdDU0tPLTI4IiwgIkdDU0tPLTE5IiwgIkdDU0tPLTEzIiksIGdlbmVzX29mX2ludGVyZXN0JG5hbWUpLCBdCgojIyBwcmVwYXJlIGN1c3RvbSBkYXRhZnJhbWUgZm9yIGFsbCBjZWxscyBieSBtb2R1bGVzOgphZ2dfbWF0X2dlbmVzX29mX2ludGVyZXN0IDwtIGFnZ3JlZ2F0ZV9nZW5lX2V4cHJlc3Npb24obW9ub2NsZS5vYmplY3QsIGdlbmVzX29mX2ludGVyZXN0WywxOjJdKQoKIyMgcmVvcmRlciB1c2luZyBuZXcgb3JkZXIKYWdnX21hdF9nZW5lc19vZl9pbnRlcmVzdCA8LSBhZ2dfbWF0X2dlbmVzX29mX2ludGVyZXN0Wyxjb2wub3JkZXJdCgojIyBwbG90CmhlYXRtYXBfcGxvdCA8LSBwaGVhdG1hcDo6cGhlYXRtYXAoYWdnX21hdF9nZW5lc19vZl9pbnRlcmVzdCwgCiAgICAgICAgICAgICAgICAgICAjc2NhbGU9InJvdyIsCiAgICAgICAgICAgICAgICAgICBjbHVzdGVyX2NvbHMgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJfcm93cyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICBjbHVzdGVyaW5nX21ldGhvZD0id2FyZC5EMiIsCiAgICAgICAgICAgICAgICAgICBzaG93X2NvbG5hbWVzID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICBsYWJlbHNfcm93ID0gYXMuY2hhcmFjdGVyKGdlbmVzX29mX2ludGVyZXN0WywzXSksCiAgICAgICAgICAgICAgICAgICBnYXBzX2NvbCA9IGMobGVuZ3RoKGFzZXhfY2VsbHMpLCBsZW5ndGgoYyhhc2V4X2NlbGxzLGJpX2NlbGxzKSksIGxlbmd0aChjKGFzZXhfY2VsbHMsYmlfY2VsbHMsZmVtYWxlX2NlbGxzKSkpLAogICAgICAgICAgICAgICAgICAgI2dhcHNfcm93ID0gYygxLCA2KSwKICAgICAgICAgICAgICAgICAgIGN1dHJlZV9yb3dzID0gMiwKICAgICAgICAgICAgICAgICAgICMjIHRyeWluZyB0byBmaXggbGVnZW5kIGlzc3VlIGhlcmUKICAgICAgICAgICAgICAgICAgICNmb250c2l6ZV9yb3cgPSAxMCwKICAgICAgICAgICAgICAgICAgICNmb250c2l6ZV9jb2wgPSAzLAogICAgICAgICAgICAgICAgICAgI2NlbGxoZWlnaHQ9MywgCiAgICAgICAgICAgICAgICAgICAjY2VsbHdpZHRoID0gMywKICAgICAgICAgICAgICAgICAgIGxlZ2VuZCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uX2xlZ2VuZCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbl9jb2wgPSBhbm5vX25vX2dyb3VwLCAKICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25fY29sb3JzID0gYW5ub3RhdGlvbl9jb2xvdXJzCiAgICAgICAgICAgICAgICAgICApCgpoZWF0bWFwX3Bsb3QKYGBgCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMjIyBQbG90IHNwZWNpZmljIGdlbmVzIG9mIGludGVyZXN0CgpTaWRlIHBsb3RzCgpjb25zdHJ1Y3QgbmV3IGRhdGFmcmFtZXMgZm9yIHRoZSBjZWxscyBmcm9tIG11dGFudHMgZm9yIGVhY2ggc2V4CmBgYHtyfQojIyBUaGUgb3JpZ2luYWwgb2JqZWN0IGNvbnRhaW5zIGFsbCBjZWxscywgd2UganVzdCB3YW50IHdpbGQtdHlwZSBzbyBsZXQncyBzdWJzZXQgb3V0IGdlbmVfbW9kdWxlX2RmIGFuZCBjZWxsX2dyb3VwX2RmIGFjY29yZGluZ2x5CgojIyBtYWxlCiMjIHN1YnNldCBvdXQgb25seSBtYWxlIGFuZCBwcmUgZGV0ZXJtaW5hdGlvbiBjZWxscwptYWxlX2NlbGxzIDwtIHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YVt3aGljaCh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGEkYXRfc2V4ID09ICJtYWxlIiksIF0KIyMgdGFrZSBmb3J3YXJkIG9ubHkgc21hcnQtc2VxMgptYWxlX2NlbGxzIDwtIG1hbGVfY2VsbHNbd2hpY2gobWFsZV9jZWxscyRleHBlcmltZW50ID09ICJtdXRhbnRzIiksIF0KIyMgZ2V0IGNlbGwgbmFtZXMKbWFsZV9jZWxscyA8LSByb3duYW1lcyhtYWxlX2NlbGxzKQojIyBzdWJzZXQgU2V1cmF0IG9iamVjdCB0byBjb250YWluIGNlbGxzIG9mIGludGVyZXN0ICAKbWFsZS5zZXVyYXQub2JqZWN0IDwtIFN1YnNldERhdGEodGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXgsIGNlbGxzID0gbWFsZV9jZWxscykKIyMgbWFrZSBuZXcgY291bnRzIGFuZCBwaGVubzoKZGF0YSA8LSBhcyhhcy5tYXRyaXgoR2V0QXNzYXlEYXRhKG1hbGUuc2V1cmF0Lm9iamVjdCwgYXNzYXkgPSAiUk5BIiwgc2xvdCA9ICJkYXRhIikpLCAnc3BhcnNlTWF0cml4JykKcGQgPC0gZGF0YS5mcmFtZShtYWxlLnNldXJhdC5vYmplY3RAbWV0YS5kYXRhKQojIyBrZWVwIG9ubHkgdGhlIGNvbHVtbnMgdGhhdCBhcmUgcmVsZXZhbnQKI3BEYXRhIDwtIHBkICU+JSBzZWxlY3Qob3JpZy5pZGVudCwgbkNvdW50X1JOQSwgbkZlYXR1cmVfUk5BKQpmRGF0YSA8LSBkYXRhLmZyYW1lKGdlbmVfc2hvcnRfbmFtZSA9IHJvdy5uYW1lcyhkYXRhKSwgcm93Lm5hbWVzID0gcm93Lm5hbWVzKGRhdGEpKQojIyBDb25zdHJ1Y3QgbW9ub2NsZSBjZHMKbWFsZS5tb25vY2xlLm9iamVjdCA8LSBuZXdfY2VsbF9kYXRhX3NldChleHByZXNzaW9uX2RhdGEgPSBkYXRhLCBjZWxsX21ldGFkYXRhID0gcGQsIGdlbmVfbWV0YWRhdGEgPSBmRGF0YSkKIyMgcHJlcHJvY2VzcwptYWxlLm1vbm9jbGUub2JqZWN0ID0gcHJlcHJvY2Vzc19jZHMobWFsZS5tb25vY2xlLm9iamVjdCwgbnVtX2RpbSA9IDUwLCBub3JtX21ldGhvZCA9ICJub25lIikgIAojIyBtYWtlIGEgbmV3IGRhdGFmcmFtZSBmb3IgY2VsbCBncm91cHMgLSBpdCBpcyBjcnVjaWFsIHRvIHJlZmFjdG9yIG90aGVyd2lzZSBhZ2dyZWdhdGVfZ2VuZV9leHByZXNzaW9uIHRoaW5rcyBpdCdzIG91dCBvZiBib3VuZHMgIAojbWFsZV9jZWxsX2dyb3VwX2RmIDwtIGRhdGEuZnJhbWUoY2VsbD1hcy5jaGFyYWN0ZXIoZmFjdG9yKG1hbGVfY2VsbF9ncm91cF9kZiRjZWxsX2lkKSksIGNlbGxfZ3JvdXA9ZmFjdG9yKG1hbGVfY2VsbF9ncm91cF9kZiRwdF9iaW4pKSAgCiMjIGFnZ3JlZ2F0ZSBleHByZXNzaW9uCm1hbGVfYWdnX21hdCA8LSBhZ2dyZWdhdGVfZ2VuZV9leHByZXNzaW9uKG1hbGUubW9ub2NsZS5vYmplY3QsIGdlbmVfbW9kdWxlX2RmX3NleCwgZXhjbHVkZS5uYSA9IEZBTFNFKQoKIyMgZmVtYWxlCiMjIHN1YnNldCBvdXQgb25seSBtYWxlIGFuZCBwcmUgZGV0ZXJtaW5hdGlvbiBjZWxscwpmZW1hbGVfY2VsbHMgPC0gdGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXhAbWV0YS5kYXRhW3doaWNoKHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YSRhdF9zZXggPT0gImZlbWFsZSIpLCBdCiMjIHRha2UgZm9yd2FyZCBvbmx5IHdpbGQtdHlwZQpmZW1hbGVfY2VsbHMgPC0gZmVtYWxlX2NlbGxzW3doaWNoKGZlbWFsZV9jZWxscyRleHBlcmltZW50ID09ICJtdXRhbnRzIiksIF0KIyMgZ2V0IGNlbGwgbmFtZXMKZmVtYWxlX2NlbGxzIDwtIHJvd25hbWVzKGZlbWFsZV9jZWxscykKIyMgc3Vic2V0IG91ciBjZWxsIGdyb3VwIGRmIHRvIGtlZXAgb25seSB0aGVzZSBjZWxscwojZmVtYWxlX2NlbGxfZ3JvdXBfZGYgPC0gZmVtYWxlX2NlbGxfZ3JvdXBfZGZbd2hpY2goZmVtYWxlX2NlbGxfZ3JvdXBfZGYkY2VsbF9pZCAlaW4lIGZlbWFsZV9jZWxscyksXQojIyBzdWJzZXQgU2V1cmF0IG9iamVjdCB0byBjb250YWluIGNlbGxzIG9mIGludGVyZXN0ICAKZmVtYWxlLnNldXJhdC5vYmplY3QgPC0gU3Vic2V0RGF0YSh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleCwgY2VsbHMgPSBmZW1hbGVfY2VsbHMpCiMjIG1ha2UgbmV3IGNvdW50cyBhbmQgcGhlbm86CmRhdGEgPC0gYXMoYXMubWF0cml4KEdldEFzc2F5RGF0YShmZW1hbGUuc2V1cmF0Lm9iamVjdCwgYXNzYXkgPSAiUk5BIiwgc2xvdCA9ICJkYXRhIikpLCAnc3BhcnNlTWF0cml4JykKcGQgPC0gZGF0YS5mcmFtZShmZW1hbGUuc2V1cmF0Lm9iamVjdEBtZXRhLmRhdGEpCiMjIGtlZXAgb25seSB0aGUgY29sdW1ucyB0aGF0IGFyZSByZWxldmFudAojcERhdGEgPC0gcGQgJT4lIHNlbGVjdChvcmlnLmlkZW50LCBuQ291bnRfUk5BLCBuRmVhdHVyZV9STkEpCmZEYXRhIDwtIGRhdGEuZnJhbWUoZ2VuZV9zaG9ydF9uYW1lID0gcm93Lm5hbWVzKGRhdGEpLCByb3cubmFtZXMgPSByb3cubmFtZXMoZGF0YSkpCiMjIENvbnN0cnVjdCBtb25vY2xlIGNkcwpmZW1hbGUubW9ub2NsZS5vYmplY3QgPC0gbmV3X2NlbGxfZGF0YV9zZXQoZXhwcmVzc2lvbl9kYXRhID0gZGF0YSwgY2VsbF9tZXRhZGF0YSA9IHBkLCBnZW5lX21ldGFkYXRhID0gZkRhdGEpCiMjIHByZXByb2Nlc3MKZmVtYWxlLm1vbm9jbGUub2JqZWN0ID0gcHJlcHJvY2Vzc19jZHMoZmVtYWxlLm1vbm9jbGUub2JqZWN0LCBudW1fZGltID0gNTAsIG5vcm1fbWV0aG9kID0gIm5vbmUiKSAgCiMjIG1ha2UgYSBuZXcgZGF0YWZyYW1lIGZvciBjZWxsIGdyb3VwcyAtIGl0IGlzIGNydWNpYWwgdG8gcmVmYWN0b3Igb3RoZXJ3aXNlIGFnZ3JlZ2F0ZV9nZW5lX2V4cHJlc3Npb24gdGhpbmtzIGl0J3Mgb3V0IG9mIGJvdW5kcyAgCiNmZW1hbGVfY2VsbF9ncm91cF9kZiA8LSBkYXRhLmZyYW1lKGNlbGw9YXMuY2hhcmFjdGVyKGZhY3RvcihmZW1hbGVfY2VsbF9ncm91cF9kZiRjZWxsX2lkKSksIGNlbGxfZ3JvdXA9ZmFjdG9yKGZlbWFsZV9jZWxsX2dyb3VwX2RmJHB0X2JpbikpICAKIyMgYWdncmVnYXRlIGV4cHJlc3Npb24KZmVtYWxlX2FnZ19tYXQgPC0gYWdncmVnYXRlX2dlbmVfZXhwcmVzc2lvbihmZW1hbGUubW9ub2NsZS5vYmplY3QsIGdlbmVfbW9kdWxlX2RmX3NleCwgZXhjbHVkZS5uYSA9IEZBTFNFKQpgYGAKCm1hbGUKYGBge3IsIGZpZy5oZWlnaHQgPSA4LCBmaWcud2lkdGggPSAxMn0KIyBtYWxlX2FnZ19tYXQKIyMgcmVvcmRlciB1c2luZyBuZXcgb3JkZXIKbWFsZV9hZ2dfbWF0IDwtIG1hbGVfYWdnX21hdFtyb3cub3JkZXIsIF0KCiMjIG1ha2UgYW4gYW5vdGF0aW9uCmFubm9fbWFsZSA8LSBkYXRhLmZyYW1lKG1hbGUubW9ub2NsZS5vYmplY3RAY29sRGF0YSRhdF9zZXgsIG1hbGUubW9ub2NsZS5vYmplY3RAY29sRGF0YSRvbGRfcHRfdmFsdWVzLCBnZW5vdHlwZSA9IG1hbGUubW9ub2NsZS5vYmplY3RAY29sRGF0YSRpZGVudGl0eV91cGRhdGVkLCByb3cubmFtZXMgPSByb3duYW1lcyhtYWxlLm1vbm9jbGUub2JqZWN0QGNvbERhdGEpKQpuYW1lcyhhbm5vX21hbGUpIDwtIGMoInNleCIsICJQc2V1ZG90aW1lIiwgImdlbm90eXBlIikKCiMjIG1ha2UgYW5ub3RhdGlvbiBjb2xvdXJzCmFubm90YXRpb25fY29sb3VycyA8LSBsaXN0KHNleCA9IGMobWFsZT0iIzAxNmMwMCIsIGZlbWFsZT0iI2E1MmIxZSIsICdwcmUtZGV0JyA9ICIjMDA1MmM1IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFBzZXVkb3RpbWUgPSBtYWdtYSgxMiwgZGlyZWN0aW9uID0gMSkpCgojIyBjaGFuZ2UgdGhlIG9yZGVyIG9mIHRoZSBkYXRhIGZyYW1lCmNvbC5vcmRlci5tYWxlIDwtIHJvd25hbWVzKGFubm9fbWFsZVt3aXRoKGFubm9fbWFsZSwgb3JkZXIoZ2Vub3R5cGUsIFBzZXVkb3RpbWUpKSwgXSkKbWFsZV9hZ2dfbWF0IDwtIG1hbGVfYWdnX21hdFssY29sLm9yZGVyLm1hbGVdCgojIyBwbG90CmhlYXRtYXBfbWFsZSA8LSBwaGVhdG1hcDo6cGhlYXRtYXAobWFsZV9hZ2dfbWF0LCAKICAgICAgICAgICAgICAgICAgICNzY2FsZT0icm93IiwKICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJfY29scyA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgY2x1c3Rlcl9yb3dzID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICBjbHVzdGVyaW5nX21ldGhvZD0id2FyZC5EMiIsCiAgICAgICAgICAgICAgICAgICBzaG93X2NvbG5hbWVzID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICBsZWdlbmQgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25fbGVnZW5kID0gVFJVRSwKICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25fY29sID0gYW5ub19tYWxlLCAKICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25fY29sb3JzID0gYW5ub3RhdGlvbl9jb2xvdXJzLCAKICAgICAgICAgICAgICAgICAgIGN1dHJlZV9yb3dzID0gMTIpCgpoZWF0bWFwX21hbGUKYGBgCgpgYGB7ciwgZmlnLmhlaWdodCA9IDgsIGZpZy53aWR0aCA9IDEyfQojIGZlbWFsZV9hZ2dfbWF0CiMjIHJlb3JkZXIgdXNpbmcgbmV3IG9yZGVyCmZlbWFsZV9hZ2dfbWF0IDwtIGZlbWFsZV9hZ2dfbWF0W3Jvdy5vcmRlciwgXQoKIyMgbWFrZSBhbiBhbm90YXRpb24KYW5ub19mZW1hbGUgPC0gZGF0YS5mcmFtZShmZW1hbGUubW9ub2NsZS5vYmplY3RAY29sRGF0YSRhdF9zZXgsIGZlbWFsZS5tb25vY2xlLm9iamVjdEBjb2xEYXRhJG9sZF9wdF92YWx1ZXMsIGdlbm90eXBlID0gZmVtYWxlLm1vbm9jbGUub2JqZWN0QGNvbERhdGEkaWRlbnRpdHlfdXBkYXRlZCwgcm93Lm5hbWVzID0gcm93bmFtZXMoZmVtYWxlLm1vbm9jbGUub2JqZWN0QGNvbERhdGEpKQpuYW1lcyhhbm5vX2ZlbWFsZSkgPC0gYygic2V4IiwgIlBzZXVkb3RpbWUiLCAiZ2Vub3R5cGUiKQoKIyMgbWFrZSBhbm5vdGF0aW9uIGNvbG91cnMKYW5ub3RhdGlvbl9jb2xvdXJzIDwtIGxpc3Qoc2V4ID0gYyhtYWxlPSIjMDE2YzAwIiwgZmVtYWxlPSIjYTUyYjFlIiwgJ3ByZS1kZXQnID0gIiMwMDUyYzUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgUHNldWRvdGltZSA9IG1hZ21hKDEyLCBkaXJlY3Rpb24gPSAxKSkKCiMjIGNoYW5nZSB0aGUgb3JkZXIgb2YgdGhlIGRhdGEgZnJhbWUKY29sLm9yZGVyLmZlbWFsZSA8LSByb3duYW1lcyhhbm5vX2ZlbWFsZVt3aXRoKGFubm9fZmVtYWxlLCBvcmRlcihnZW5vdHlwZSwgUHNldWRvdGltZSkpLCBdKQpmZW1hbGVfYWdnX21hdCA8LSBmZW1hbGVfYWdnX21hdFssY29sLm9yZGVyLmZlbWFsZV0KCiMjIHBsb3QKaGVhdG1hcF9mZW1hbGUgPC0gcGhlYXRtYXA6OnBoZWF0bWFwKGZlbWFsZV9hZ2dfbWF0LCAKICAgICAgICAgICAgICAgICAgICNzY2FsZT0icm93IiwKICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJfY29scyA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgY2x1c3Rlcl9yb3dzID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICBjbHVzdGVyaW5nX21ldGhvZD0id2FyZC5EMiIsCiAgICAgICAgICAgICAgICAgICBzaG93X2NvbG5hbWVzID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICBsZWdlbmQgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25fbGVnZW5kID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uX2NvbCA9IGFubm9fZmVtYWxlLCAKICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25fY29sb3JzID0gYW5ub3RhdGlvbl9jb2xvdXJzLCAKICAgICAgICAgICAgICAgICAgIGN1dHJlZV9yb3dzID0gMTIpCgpoZWF0bWFwX2ZlbWFsZQoKIyMgc2F2ZSBhIHBoZWF0bWFwOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80MzA1MTUyNS9ob3ctdG8tZHJhdy1waGVhdG1hcC1wbG90LXRvLXNjcmVlbi1hbmQtYWxzby1zYXZlLXRvLWZpbGUKYGBgCgpzaWRlIHBsb3RzIHdpdGggZ3JvdXBzIG9mIG11dGFudCBjZWxscwoKZmVtYWxlCmBgYHtyfQojIyBtYWtlIGEgbmV3IGdyb3VwaW5nIGZvciBjZWxscyBiYXNlZCBvbiB0aGVpciBpZGVudGl0eQptdXRhbnRfZ3JvdXBfZmVtYWxlIDwtIGRhdGEuZnJhbWUoY2VsbCA9IHJvd25hbWVzKGZlbWFsZS5tb25vY2xlLm9iamVjdEBjb2xEYXRhKSwgY2VsbF9ncm91cCA9IGZlbWFsZS5tb25vY2xlLm9iamVjdEBjb2xEYXRhJGlkZW50aXR5X3VwZGF0ZWQpCgojIyBhZ2dyZWdhdGUgZXhwcmVzc2lvbgpmZW1hbGVfYWdnX21hdF9ncm91cGVkIDwtIGFnZ3JlZ2F0ZV9nZW5lX2V4cHJlc3Npb24oZmVtYWxlLm1vbm9jbGUub2JqZWN0LCBnZW5lX21vZHVsZV9kZl9zZXgsIG11dGFudF9ncm91cF9mZW1hbGUsIGV4Y2x1ZGUubmEgPSBGQUxTRSkKCiMjIHJlb3JkZXIgdXNpbmcgbmV3IG9yZGVyCmZlbWFsZV9hZ2dfbWF0X2dyb3VwZWQgPC0gZmVtYWxlX2FnZ19tYXRfZ3JvdXBlZFtyb3cub3JkZXIsIF0KCiMjIHBsb3QKcGhlYXRtYXA6OnBoZWF0bWFwKGZlbWFsZV9hZ2dfbWF0X2dyb3VwZWQsIAogICAgICAgICAgICAgICAgICAgI3NjYWxlPSJyb3ciLAogICAgICAgICAgICAgICAgICAgY2x1c3Rlcl9jb2xzID0gVFJVRSwKICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgY2x1c3RlcmluZ19tZXRob2Q9IndhcmQuRDIiLAogICAgICAgICAgICAgICAgICAgc2hvd19jb2xuYW1lcyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICBsZWdlbmQgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25fbGVnZW5kID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAjYW5ub3RhdGlvbl9jb2wgPSBhbm5vX2ZlbWFsZSwgCiAgICAgICAgICAgICAgICAgICAjYW5ub3RhdGlvbl9jb2xvcnMgPSBhbm5vdGF0aW9uX2NvbG91cnMsIAogICAgICAgICAgICAgICAgICAgY3V0cmVlX3Jvd3MgPSAxMikKCgpgYGAKCm1hbGUKYGBge3J9CgpgYGAKCm1vZHVsZSAxMiBpbnNwZWN0aW9uCgpgYGB7ciwgZmlnLmhlaWdodCA9IDEwLCBmaWcud2lkdGggPSAxMn0KIyMgbWFrZSBhIGRmIGZvciBtb2R1bGUgMTIgZ2VuZXMKbW9kdWxlLjEyLmdlbmVzIDwtIGdlbmVfbW9kdWxlX2RmX3NleFtnZW5lX21vZHVsZV9kZl9zZXgkbW9kdWxlID09IDEyLCBdJGlkCm1vZHVsZS4xMi5nZW5lcyA8LSBkYXRhLmZyYW1lKGlkID0gbW9kdWxlLjEyLmdlbmVzLCBncm91cCA9IG1vZHVsZS4xMi5nZW5lcykKCiMjIHByZXBhcmUgY3VzdG9tIGRhdGFmcmFtZSBmb3IgYWxsIGNlbGxzIGJ5IG1vZHVsZXM6CmFnZ19tYXRfbW9kdWxlXzEyIDwtIGFnZ3JlZ2F0ZV9nZW5lX2V4cHJlc3Npb24obW9ub2NsZS5vYmplY3QsIG1vZHVsZS4xMi5nZW5lcykKCiMjIG1ha2UgYW4gYW5vdGF0aW9uCmFubm9fbm9fZ3JvdXAgPC0gZGF0YS5mcmFtZShtb25vY2xlLm9iamVjdEBjb2xEYXRhJHNleF9VTUFQLCBtb25vY2xlLm9iamVjdEBjb2xEYXRhJG9sZF9wdF92YWx1ZXMsIHJvdy5uYW1lcyA9IHJvd25hbWVzKG1vbm9jbGUub2JqZWN0QGNvbERhdGEpKQpuYW1lcyhhbm5vX25vX2dyb3VwKSA8LSBjKCJzZXgiLCAiUHNldWRvdGltZSIpCgojIyBtYWtlIGFubm90YXRpb24gY29sb3Vycwphbm5vdGF0aW9uX2NvbG91cnMgPC0gbGlzdChzZXggPSBjKG1hbGU9IiMwMTZjMDAiLCBmZW1hbGU9IiNhNTJiMWUiLCAncHJlLWRldCcgPSAiIzAwNTJjNSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBQc2V1ZG90aW1lID0gbWFnbWEoMTIsIGRpcmVjdGlvbiA9IDEpKQoKIyMgY2hhbmdlIHRoZSBvcmRlciBvZiB0aGUgZGF0YSBmcmFtZQpjb2wub3JkZXIgPC0gYyhwcmVfZGV0X29yZGVyZWRfY2VsbHMsIGZlbWFsZV9vcmRlcmVkX2NlbGxzLCBtYWxlX29yZGVyZWRfY2VsbHMpCmFnZ19tYXRfbW9kdWxlXzEyIDwtIGFnZ19tYXRfbW9kdWxlXzEyWyxjb2wub3JkZXJdCgojIyBwbG90CnBoZWF0bWFwOjpwaGVhdG1hcChhZ2dfbWF0X21vZHVsZV8xMiwgCiAgICAgICAgICAgICAgICAgICAjc2NhbGU9InJvdyIsCiAgICAgICAgICAgICAgICAgICBjbHVzdGVyX2NvbHMgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJpbmdfbWV0aG9kPSJ3YXJkLkQyIiwKICAgICAgICAgICAgICAgICAgIHNob3dfY29sbmFtZXMgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25fY29sID0gYW5ub19ub19ncm91cCwgCiAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uX2NvbG9ycyA9IGFubm90YXRpb25fY29sb3VycywKICAgICAgICAgICAgICAgICAgIGZvbnRzaXplX3JvdyA9IDcsCiAgICAgICAgICAgICAgICAgICBjdXRyZWVfcm93cyA9IDEyKQpgYGAKc2F2ZSBwbG90CmBgYHtyfQpoZWF0bWFwX21vZHVsZV8xMiA8LSBwaGVhdG1hcDo6cGhlYXRtYXAoYWdnX21hdF9tb2R1bGVfMTIsIAogICAgICAgICAgICAgICAgICAgI3NjYWxlPSJyb3ciLAogICAgICAgICAgICAgICAgICAgY2x1c3Rlcl9jb2xzID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICBjbHVzdGVyaW5nX21ldGhvZD0id2FyZC5EMiIsCiAgICAgICAgICAgICAgICAgICBzaG93X2NvbG5hbWVzID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uX2NvbCA9IGFubm9fbm9fZ3JvdXAsIAogICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbl9jb2xvcnMgPSBhbm5vdGF0aW9uX2NvbG91cnMsCiAgICAgICAgICAgICAgICAgICBmb250c2l6ZV9yb3cgPSA3LAogICAgICAgICAgICAgICAgICAgY3V0cmVlX3Jvd3MgPSAxMikKCgoKCmBgYAoKQVAyIEV4cHJlc3Npb24KCmBgYHtyfQojIyByZWFkaW5nIHRhYmxlIG9mIEFQMiBnZW5lcwphcDJfZ2VuZXNfdGFibGUgPC0gcmVhZC5kZWxpbShmaWxlID0gIn4vZGF0YS9BUDJfZ2VuZXNfdGFibGUudHh0IiwgaGVhZGVyID0gVFJVRSwgc2VwID0iXHQiKQoKIyMgZXh0cmFjdCBsaXN0IG9mIGdlbmVzCmFwMl9nZW5lc19saXN0IDwtIGRwbHlyOjpwdWxsKGFwMl9nZW5lc190YWJsZSwgR2VuZS5JRCkKYXAyX2dlbmVzX2xpc3QgPC0gZ3N1YigiXyIsICItIiwgYXAyX2dlbmVzX2xpc3QpCgojIyBtYWtlIGEgZGYgZm9yIGdlbmVzCmFwMl9nZW5lc19saXN0IDwtIGRhdGEuZnJhbWUoaWQgPSBhcDJfZ2VuZXNfbGlzdCwgZ3JvdXAgPSBhcDJfZ2VuZXNfbGlzdCkKCiMjIHByZXBhcmUgY3VzdG9tIGRhdGFmcmFtZSBmb3IgYWxsIGNlbGxzIGJ5IG1vZHVsZXM6CmFnZ19tYXRfYXAycyA8LSBhZ2dyZWdhdGVfZ2VuZV9leHByZXNzaW9uKG1vbm9jbGUub2JqZWN0LCBhcDJfZ2VuZXNfbGlzdCkKCiMjIGNoYW5nZSB0aGUgb3JkZXIgb2YgdGhlIGRhdGEgZnJhbWUKY29sLm9yZGVyIDwtIGMocHJlX2RldF9vcmRlcmVkX2NlbGxzLCBmZW1hbGVfb3JkZXJlZF9jZWxscywgbWFsZV9vcmRlcmVkX2NlbGxzKQphZ2dfbWF0X2FwMnMgPC0gYWdnX21hdF9hcDJzWyxjb2wub3JkZXJdCgojIyBwbG90CnBoZWF0bWFwOjpwaGVhdG1hcChhZ2dfbWF0X2FwMnMsIAogICAgICAgICAgICAgICAgICAgI3NjYWxlPSJyb3ciLAogICAgICAgICAgICAgICAgICAgY2x1c3Rlcl9jb2xzID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICBjbHVzdGVyaW5nX21ldGhvZD0iY29tcGxldGUiLAogICAgICAgICAgICAgICAgICAgc2hvd19jb2xuYW1lcyA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbl9jb2wgPSBhbm5vX25vX2dyb3VwLCAKICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25fY29sb3JzID0gYW5ub3RhdGlvbl9jb2xvdXJzLAogICAgICAgICAgICAgICAgICAgZm9udHNpemVfcm93ID0gNywKICAgICAgICAgICAgICAgICAgIGN1dHJlZV9yb3dzID0gMykKYGBgCgoKIyMjIE1vZHVsZSBBbmFseXNpcyAKClJlYWQgaW4gS2FzaWEncyBtb2R1bGVzOgpgYGB7cn0KIyMgcmVhZCBpbiBrYXNpYSBtb2R1bGVzOgprYXNpYV9jbHVzdGVycyA8LSByZWFkLmNzdihmaWxlID0gIn4vZGF0YS9Nb2R1bGVzX0NsdXN0ZXJzX1BoZW5vdHlwZXMuY3N2IiwgaGVhZGVyID0gVFJVRSkKCiMjIGNoYW5nZSBfIHRvIC06Cmthc2lhX2NsdXN0ZXJzJG5ldy5nZW5lLklEIDwtIGdzdWIoIl8iLCAiLSIsIGthc2lhX2NsdXN0ZXJzJG5ldy5nZW5lLklEKQoKIyMgZmlsdGVyIG91dCBnZW5lcyBub3QgaW4gbW9kdWxlcyBnZW5lX21vZHVsZV9kZl9zZXg6Cmthc2lhX2NsdXN0ZXJzX2ZpbHRlcmVkIDwtIGthc2lhX2NsdXN0ZXJzW3doaWNoKGthc2lhX2NsdXN0ZXJzJG5ldy5nZW5lLklEICVpbiUgZ2VuZV9tb2R1bGVfZGZfc2V4JGlkKSwgXQoKIyMgcmVuYW1lIG5ldyBnZW5lIGlkCm5hbWVzKGthc2lhX2NsdXN0ZXJzX2ZpbHRlcmVkKVsyXSA8LSAiaWQiCgojIyBtZXJnZSB0b2dldGhlcgptb2R1bGVzX21lcmdlZF9kZiA8LSBtZXJnZShrYXNpYV9jbHVzdGVyc19maWx0ZXJlZCwgZ2VuZV9tb2R1bGVfZGZfc2V4LCBieSA9ICJpZCIpCgojIyBsb29rIGF0IHRoZSBlbnJpY2htZW50IHdpdGggYSBkb3RwbG90Ogpkb3RfcGxvdF9kZl9wYyA8LSAoYXMuZGF0YS5mcmFtZS5tYXRyaXgocHJvcC50YWJsZSh0YWJsZShtb2R1bGVzX21lcmdlZF9kZiRLYXNpYS5DbHVzdGVyLCBkZl9tZXRhX2RhdGEkaWRlbnRpdHlfY29tYmluZWQpLCBtYXJnaW4gPSAyKSkgKiAxMDApCmBgYAoKCgoKCgoKCgpOT1QgVVNFRApjb21wbGV4IGhlYXRtYXAgdmVyc2lvbgoKYGBge3J9CiMjIG1ha2UgaW50byBtYXRyaXggdG8gcGxvdApjb2wub3JkZXIgPC0gYWdnX21hdF9hbGxfY2VsbHNfbWF0cml4IDwtIGFzLm1hdHJpeChhZ2dfbWF0X2FsbF9jZWxscykKYGBgCgptYWtlIGFubm90YXRpb24KYGBge3J9CiMjIGV4dHJhY3QgcHNldWRvdGltZSB2YWx1ZXM6CnB0X3ZhbHVlcyA8LSBhcy5kYXRhLmZyYW1lKHBzZXVkb3RpbWUobW9ub2NsZS5vYmplY3QsIHJlZHVjdGlvbl9tZXRob2QgPSAiVU1BUCIpKQpuYW1lcyhwdF92YWx1ZXMpIDwtICJtb25vY2xlX3B0X3NleF93dCIKdGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXggPC0gQWRkTWV0YURhdGEodGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXgsIHB0X3ZhbHVlcykKCiMjIHNhdmUgcHQgdmFsdWVzCndyaXRlLmNzdihwdF92YWx1ZXMsIGZpbGUgPSAifi9kYXRhX3RvX2V4cG9ydC9wdF92YWx1ZXNfc2V4X29ubHkuY3N2IikKYGBgCgpgYGB7cn0KbGlicmFyeShjaXJjbGl6ZSkKIyMgbWFrZSB0aGUgYW5ub3RhdGlvbiBkZgojIyBnZXQgbWV0YSBkYXRhIGZyb20gc2V1cmF0IG9iamVjdCBhbmQgdGhlbiBzdWJzZXQgcm93cyBvdXQgdGhhdCBhcmUgd3QKZGZfYW5ubyA8LSB0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGFbd2hpY2gocm93bmFtZXModGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXhAbWV0YS5kYXRhKSAlaW4lIGNvbG5hbWVzKGFnZ19tYXRfYWxsX2NlbGxzX21hdHJpeCkpLCBdCiMjIGdldCBvbmx5IGNvbHVtbnMgb2YgaW50ZXJlc3Q6CmRmX2Fubm8gPC0gZGZfYW5ub1sgLGMoInNleCIsICJtb25vY2xlX3B0X3NleF93dCIpLCBkcm9wID0gRkFMU0UgXQoKIyMgb3JkZXIgYW5ub3RhdGlvbgpkZl9hbm5vIDwtIGRmX2Fubm9bd2l0aChkZl9hbm5vLCBvcmRlcihzZXgsIG1vbm9jbGVfcHRfc2V4X3d0KSksXQoKIyMgb3JkZXIgY29scyBpbiB0aGUgbWF0cml4CmFnZ19tYXRfYWxsX2NlbGxzX21hdHJpeCA8LSBhZ2dfbWF0X2FsbF9jZWxsc19tYXRyaXhbICxtYXRjaChjb2xuYW1lcyhhZ2dfbWF0X2FsbF9jZWxsc19tYXRyaXgpLCByb3duYW1lcyhkZl9hbm5vKSldCgojIyBtYWtlIGFubm90YXRpb24KaGVhdG1hcF9hbm5vdGF0aW9uIDwtIEhlYXRtYXBBbm5vdGF0aW9uKGRmID0gY2x1c3Rlcl9hbm5vLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCA9IGxpc3Qoc2V4ID0gYyhtYWxlPSIjMDE2YzAwIiwgZmVtYWxlPSIjYTUyYjFlIiwgYHByZS1kZXRgID0gIiMwMDUyYzUiKSwgbW9ub2NsZV9wdF9zZXhfd3QgPSBjb2xvclJhbXAyKGMoMTo3MCksIGluZmVybm8oNzApKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKCmhlYXRtYXBfYW5ub3RhdGlvbiA8LSBIZWF0bWFwQW5ub3RhdGlvbihzZXggPSBkZl9hbm5vJHNleCwgcHQgPSBkZl9hbm5vJG1vbm9jbGVfcHRfc2V4X3d0KQpgYGAKCnBsb3QKYGBge3J9CiMjIG1ha2UgaGVhdG1hcAptb2R1bGVzX2hlYXRtYXAgPC0gSGVhdG1hcChhZ2dfbWF0X2FsbF9jZWxsc19tYXRyaXgsCiAgICAgICAgY29sdW1uX29yZGVyID0gTlVMTCwKICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSwKICAgICAgICBjbHVzdGVyX3Jvd3MgPSBGQUxTRSwKICAgICAgICBzaG93X2NvbHVtbl9kZW5kID0gRkFMU0UsCiAgICAgICAgY29sdW1uX2xhYmVscyA9IHJlcCgiIiwgbmNvbChhZ2dfbWF0X2FsbF9jZWxsc19tYXRyaXgpKSwKICAgICAgICAjcm93X29yZGVyID0gbW9kdWxlX2RlbmRybyRvcmRlciwKICAgICAgICBjbHVzdGVyaW5nX21ldGhvZF9jb2x1bW5zID0gIndhcmQuRDIiLAogICAgICAgIGJvdHRvbV9hbm5vdGF0aW9uID0gaGVhdG1hcF9hbm5vdGF0aW9uLAogICAgICAgIGNvbCA9IGNvbG9yUmFtcFBhbGV0dGUocmV2KGJyZXdlci5wYWwobiA9IDcsIG5hbWUgPQogICJSZFlsQnUiKSkpKDEwMCksIAogICAgICAgIGhlYXRtYXBfbGVnZW5kX3BhcmFtID0gbGlzdChkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpKQoKIyMgcHJpbnQKZHJhdyhtb2R1bGVzX2hlYXRtYXAsIG1lcmdlX2xlZ2VuZCA9IFRSVUUsIGhlYXRtYXBfbGVnZW5kX3NpZGUgPSAiYm90dG9tIiwgCiAgICBhbm5vdGF0aW9uX2xlZ2VuZF9zaWRlID0gImJvdHRvbSIpCmBgYAoKYGBge3J9CiMjIGV4dHJhY3QgY291bnRzIGZyb20gMTB4IG9iamVjdAptYXRyaXhfdGVueF9jb3VudHMgPC0gYXMubWF0cml4KEdldEFzc2F5RGF0YShwYl9zZXhfZmlsdGVyZWQsIGFzc2F5ID0gIlJOQSIpKQojbmsucmF3LmRhdGEgPC0gYXMubWF0cml4KEdldEFzc2F5RGF0YShwYl9zZXhfZmlsdGVyZWQsIHNsb3QgPSAiY291bnRzIilbLCBXaGljaENlbGxzKHBibWMsIGlkZW50ID0gIk5LIildKQoKIyMgY2hlY2sgaXQgaXMgdGhlIHNhbWUgYXMgdGhlIG1lcmdlZCBvYmplY3QgUk5BIHNsb3QKCiMjIGNoZWNrIGl0IGlzIHRoZSBzYW1lIGFzIHRoZSBtb25vY2xlIG9iamVjdAptYXRyaXhfdGVueF9jb3VudHNfbW9ub2NsZSA8LSBhcy5tYXRyaXgoYXMuZGF0YS5mcmFtZSgobW9ub2NsZS5vYmplY3RAYXNzYXlzKSkpCmBgYAoKYGBge3J9CiMjIG1ha2UgaGVhdG1hcAptb2R1bGVzX2hlYXRtYXAgPC0gSGVhdG1hcChtYXRyaXhfdGVueF9jb3VudHMsCiAgICAgICAgY29sdW1uX29yZGVyID0gTlVMTCwKICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBUUlVFLAogICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLAogICAgICAgIHNob3dfY29sdW1uX2RlbmQgPSBGQUxTRSwKICAgICAgICBjb2x1bW5fbGFiZWxzID0gcmVwKCIiLCBuY29sKG1hdHJpeF90ZW54X2NvdW50cykpLAogICAgICAgICNyb3dfb3JkZXIgPSBtb2R1bGVfZGVuZHJvJG9yZGVyLAogICAgICAgIGNsdXN0ZXJpbmdfbWV0aG9kX2NvbHVtbnMgPSAid2FyZC5EMiIsCiAgICAgICAgI2JvdHRvbV9hbm5vdGF0aW9uID0gaGVhdG1hcF9hbm5vdGF0aW9uLAogICAgICAgIGNvbCA9IGNvbG9yUmFtcFBhbGV0dGUocmV2KGJyZXdlci5wYWwobiA9IDcsIG5hbWUgPQogICJSZFlsQnUiKSkpKDEwMCksIAogICAgICAgIGhlYXRtYXBfbGVnZW5kX3BhcmFtID0gbGlzdChkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpKQoKIyMgcHJpbnQKZHJhdyhtb2R1bGVzX2hlYXRtYXAsIG1lcmdlX2xlZ2VuZCA9IFRSVUUsIGhlYXRtYXBfbGVnZW5kX3NpZGUgPSAiYm90dG9tIiwgCiAgICBhbm5vdGF0aW9uX2xlZ2VuZF9zaWRlID0gImJvdHRvbSIpCmBgYAoKIyMjIyBwbG90IGFzIGEgZnVuY3Rpb24gb2YgcHNldWRvdGltZQoKTm93LCB3ZSB3aWxsIGludGVncmF0ZSB0aGUgYnJhbmNoIGRhdGEgd2UgcHJvZHVjZWQgdXNpbmcgc2xpbmdzaG90IGFuZCB0aGUgcHNldWRvdGltZSB2YWx1ZXMgdG8gcGxvdCB0aGlzIGhlYXRtYXAuIAoKTW9ub2NsZTMgaGFzIGEgaGFuZHkgZnVuY3Rpb24gdGhhdCBhbGxvd3MgdXMgdG8gYWdncmVnYXRlIGV4cHJlc3Npb24gb2YgZ3JvdXBzIG9mIGNlbGxzIGNhbGxlZCBhZ2dyZWdhdGVfZ2VuZV9leHByZXNzaW9uLiAKClRoZSBjb2RlIGZvciB0aGlzIGlzIGxvY2F0ZWQgaGVyZTogaHR0cHM6Ly9naXRodWIuY29tL2NvbGUtdHJhcG5lbGwtbGFiL21vbm9jbGUzL2Jsb2IvMWEwMjI3NDIwOWM3NjVmZTdhNjBmNTMzYTMxYjFkYTNkYWNmNjc4NS9SL2NsdXN0ZXJfZ2VuZXMuUiAKCkRlZmluZSB0aGUgZ3JvdXBzIG9mIGNlbGxzCmBgYHtyfQojIyBTcGxpdCBjZWxscyBpbnRvIGdyb3VwcyBvZiBzZXhlcwpmZW1hbGVfY2VsbHMgPC0gdGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXhAbWV0YS5kYXRhW3doaWNoKHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YSRzZXggPT0gImZlbWFsZSIpLCBdCm1hbGVfY2VsbHMgPC0gdGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXhAbWV0YS5kYXRhW3doaWNoKHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YSRzZXggPT0gIm1hbGUiKSwgXQpwcmVfZGV0X2NlbGxzIDwtIHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YVt3aGljaCh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGEkc2V4ID09ICJwcmUtZGV0IiksIF0KCiMjIGluc3BlY3QgcmFuZ2Ugb2YgcHQgdmFsdWVzIHRvIGRldGVybWluZSBiaW4gd2lkdGgKaGlzdChmZW1hbGVfY2VsbHMkUFRfTGluZWFnZUZlbWFsZSkKaGlzdChtYWxlX2NlbGxzJFBUX0xpbmVhZ2VNYWxlKQpoaXN0KHByZV9kZXRfY2VsbHMkUFRfTGluZWFnZUZlbWFsZSkKaGlzdChwcmVfZGV0X2NlbGxzJFBUX0xpbmVhZ2VNYWxlKQoKYGBgCgpVc2UgYSBiaW4gd2lkdGggb2YgMgoKdGhlcmUgd2lsbCBiZSB0d28gb2JqZWN0cyBmb3IgdGhlIGNlbGxfZ3JvdXBfZGY6IG1hbGUgYnJhbmNoIGFuZCBmZW1hbGUgYnJhbmNoLiBCb3RoIHdpbGwgaW5jbHVkZSB0aGUgcHJlLWRldCBicmFuY2gKCmBgYHtyfQojIyBEZWZpbmUgbWFsZSBhbmQgZmVtYWxlIGJyYW5jaCBjZWxscwojIG1hbGUKbWFsZV9icmFuY2hfbWV0YV9kYXRhIDwtIHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YVt3aGljaCh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGEkc2V4ID09ICJwcmUtZGV0IiB8IHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YSRzZXggPT0gIm1hbGUiKSwgXQoKbWFsZV9icmFuY2hfbWV0YV9kYXRhIDwtIGRhdGEuZnJhbWUoY2VsbF9pZCA9IHJvd25hbWVzKG1hbGVfYnJhbmNoX21ldGFfZGF0YSksIHB0ID0gbWFsZV9icmFuY2hfbWV0YV9kYXRhJFBUX0xpbmVhZ2VNYWxlKQoKbWFsZV9jZWxsX2dyb3VwX2RmIDwtIG1hbGVfYnJhbmNoX21ldGFfZGF0YQoKI2ZlbWFsZQpmZW1hbGVfYnJhbmNoX21ldGFfZGF0YSA8LSB0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGFbd2hpY2godGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXhAbWV0YS5kYXRhJHNleCA9PSAicHJlLWRldCIgfCB0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGEkc2V4ID09ICJmZW1hbGUiKSwgXQoKZmVtYWxlX2JyYW5jaF9tZXRhX2RhdGEgPC0gZGF0YS5mcmFtZShjZWxsX2lkID0gcm93bmFtZXMoZmVtYWxlX2JyYW5jaF9tZXRhX2RhdGEpLCBwdCA9IGZlbWFsZV9icmFuY2hfbWV0YV9kYXRhJFBUX0xpbmVhZ2VGZW1hbGUpCgpmZW1hbGVfY2VsbF9ncm91cF9kZiA8LSBmZW1hbGVfYnJhbmNoX21ldGFfZGF0YQoKIyMgd2hhdCdzIHRoZSByYW5nZSBvZiB2YWx1ZXMgZm9yIGVhY2ggcHQ/CgpyYW5nZShmZW1hbGVfY2VsbF9ncm91cF9kZiRwdCkKcmFuZ2UobWFsZV9jZWxsX2dyb3VwX2RmJHB0KQpgYGAKCmBgYHtyfQojIyBtYWtlIGJpbiB3aWR0aHMKIyBtYWtlIGEgbmV3IGNvbCBmb3IgYW5ub3RhdGlvbgpmZW1hbGVfY2VsbF9ncm91cF9kZiRwdF9iaW4gPC0gTkEKZm9yKGkgaW4gc2VxKDIsNjgsMikpewogIGZlbWFsZV9jZWxsX2dyb3VwX2RmJHB0X2Jpblt3aGljaChmZW1hbGVfY2VsbF9ncm91cF9kZiRwdCA8IGkgJiBmZW1hbGVfY2VsbF9ncm91cF9kZiRwdCA+PSAoaS0yKSldIDwtIGkKfQoKbWFsZV9jZWxsX2dyb3VwX2RmJHB0X2JpbiA8LSBOQQpmb3IoaSBpbiBzZXEoMiw2OCwyKSl7CiAgbWFsZV9jZWxsX2dyb3VwX2RmJHB0X2Jpblt3aGljaChtYWxlX2NlbGxfZ3JvdXBfZGYkcHQgPCBpICYgbWFsZV9jZWxsX2dyb3VwX2RmJHB0ID49IChpLTIpKV0gPC0gaQp9CiMgdGhlbiByZW1vdmUgb2xkIHB0IHZhbHVlcwptYWxlX2NlbGxfZ3JvdXBfZGYgPC0gbWFsZV9jZWxsX2dyb3VwX2RmWyAsLTJdCmZlbWFsZV9jZWxsX2dyb3VwX2RmIDwtIGZlbWFsZV9jZWxsX2dyb3VwX2RmWyAsLTJdCmBgYAoKYGBge3J9CiMjIFRoZSBvcmlnaW5hbCBvYmplY3QgY29udGFpbnMgYWxsIGNlbGxzLCB3ZSBqdXN0IHdhbnQgd2lsZC10eXBlIHNvIGxldCdzIHN1YnNldCBvdXQgZ2VuZV9tb2R1bGVfZGYgYW5kIGNlbGxfZ3JvdXBfZGYgYWNjb3JkaW5nbHkKCiMjIG1hbGUKIyMgc3Vic2V0IG91dCBvbmx5IG1hbGUgYW5kIHByZSBkZXRlcm1pbmF0aW9uIGNlbGxzCm1hbGVfY2VsbHMgPC0gdGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXhAbWV0YS5kYXRhW3doaWNoKHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YSRzZXggPT0gIm1hbGUiIHwgdGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXhAbWV0YS5kYXRhJHNleCA9PSAicHJlLWRldCIpLCBdCiMjIHRha2UgZm9yd2FyZCBvbmx5IHdpbGQtdHlwZQptYWxlX2NlbGxzIDwtIG1hbGVfY2VsbHNbd2hpY2gobWFsZV9jZWxscyRpZGVudGl0eV9jb21iaW5lZCA9PSAiV1QiIHwgbWFsZV9jZWxscyRpZGVudGl0eV9jb21iaW5lZCA9PSAiV1RfMTBYIiksIF0KI21hbGVfY2VsbHMgPC0gbWFsZV9jZWxsc1t3aGljaChtYWxlX2NlbGxzJGlkZW50aXR5X2NvbWJpbmVkID09ICJXVF8xMFgiKSwgXQojIyBnZXQgY2VsbCBuYW1lcwptYWxlX2NlbGxzIDwtIHJvd25hbWVzKG1hbGVfY2VsbHMpCiMjIHN1YnNldCBvdXIgY2VsbCBncm91cCBkZiB0byBrZWVwIG9ubHkgdGhlc2UgY2VsbHMKbWFsZV9jZWxsX2dyb3VwX2RmIDwtIG1hbGVfY2VsbF9ncm91cF9kZlt3aGljaChtYWxlX2NlbGxfZ3JvdXBfZGYkY2VsbF9pZCAlaW4lIG1hbGVfY2VsbHMpLF0KIyMgc3Vic2V0IFNldXJhdCBvYmplY3QgdG8gY29udGFpbiBjZWxscyBvZiBpbnRlcmVzdCAgCm1hbGUuc2V1cmF0Lm9iamVjdCA8LSBTdWJzZXREYXRhKHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4LCBjZWxscyA9IG1hbGVfY2VsbHMpCiMjIG1ha2UgbmV3IGNvdW50cyBhbmQgcGhlbm86CmRhdGEgPC0gYXMoYXMubWF0cml4KEdldEFzc2F5RGF0YShtYWxlLnNldXJhdC5vYmplY3QsIGFzc2F5ID0gIlJOQSIsIHNsb3QgPSAiZGF0YSIpKSwgJ3NwYXJzZU1hdHJpeCcpCnBkIDwtIGRhdGEuZnJhbWUobWFsZS5zZXVyYXQub2JqZWN0QG1ldGEuZGF0YSkKIyMga2VlcCBvbmx5IHRoZSBjb2x1bW5zIHRoYXQgYXJlIHJlbGV2YW50CiNwRGF0YSA8LSBwZCAlPiUgc2VsZWN0KG9yaWcuaWRlbnQsIG5Db3VudF9STkEsIG5GZWF0dXJlX1JOQSkKZkRhdGEgPC0gZGF0YS5mcmFtZShnZW5lX3Nob3J0X25hbWUgPSByb3cubmFtZXMoZGF0YSksIHJvdy5uYW1lcyA9IHJvdy5uYW1lcyhkYXRhKSkKIyMgQ29uc3RydWN0IG1vbm9jbGUgY2RzCm1hbGUubW9ub2NsZS5vYmplY3QgPC0gbmV3X2NlbGxfZGF0YV9zZXQoZXhwcmVzc2lvbl9kYXRhID0gZGF0YSwgY2VsbF9tZXRhZGF0YSA9IHBkLCBnZW5lX21ldGFkYXRhID0gZkRhdGEpCiMjIHByZXByb2Nlc3MKbWFsZS5tb25vY2xlLm9iamVjdCA9IHByZXByb2Nlc3NfY2RzKG1hbGUubW9ub2NsZS5vYmplY3QsIG51bV9kaW0gPSA1MCwgbm9ybV9tZXRob2QgPSAibm9uZSIpICAKIyMgbWFrZSBhIG5ldyBkYXRhZnJhbWUgZm9yIGNlbGwgZ3JvdXBzIC0gaXQgaXMgY3J1Y2lhbCB0byByZWZhY3RvciBvdGhlcndpc2UgYWdncmVnYXRlX2dlbmVfZXhwcmVzc2lvbiB0aGlua3MgaXQncyBvdXQgb2YgYm91bmRzICAKbWFsZV9jZWxsX2dyb3VwX2RmIDwtIGRhdGEuZnJhbWUoY2VsbD1hcy5jaGFyYWN0ZXIoZmFjdG9yKG1hbGVfY2VsbF9ncm91cF9kZiRjZWxsX2lkKSksIGNlbGxfZ3JvdXA9ZmFjdG9yKG1hbGVfY2VsbF9ncm91cF9kZiRwdF9iaW4pKSAgCiMjIGFnZ3JlZ2F0ZSBleHByZXNzaW9uCm1hbGVfYWdnX21hdCA8LSBhZ2dyZWdhdGVfZ2VuZV9leHByZXNzaW9uKG1hbGUubW9ub2NsZS5vYmplY3QsIGdlbmVfbW9kdWxlX2RmX3NleCwgbWFsZV9jZWxsX2dyb3VwX2RmLCBleGNsdWRlLm5hID0gRkFMU0UpCgojIyBmZW1hbGUKIyMgc3Vic2V0IG91dCBvbmx5IG1hbGUgYW5kIHByZSBkZXRlcm1pbmF0aW9uIGNlbGxzCmZlbWFsZV9jZWxscyA8LSB0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGFbd2hpY2godGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXhAbWV0YS5kYXRhJHNleCA9PSAiZmVtYWxlIiB8IHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YSRzZXggPT0gInByZS1kZXQiKSwgXQojIyB0YWtlIGZvcndhcmQgb25seSB3aWxkLXR5cGUKZmVtYWxlX2NlbGxzIDwtIGZlbWFsZV9jZWxsc1t3aGljaChmZW1hbGVfY2VsbHMkaWRlbnRpdHlfY29tYmluZWQgPT0gIldUIiB8IGZlbWFsZV9jZWxscyRpZGVudGl0eV9jb21iaW5lZCA9PSAiV1RfMTBYIiksIF0KI2ZlbWFsZV9jZWxscyA8LSBmZW1hbGVfY2VsbHNbd2hpY2goZmVtYWxlX2NlbGxzJGlkZW50aXR5X2NvbWJpbmVkID09ICJXVF8xMFgiKSwgXQojIyBnZXQgY2VsbCBuYW1lcwpmZW1hbGVfY2VsbHMgPC0gcm93bmFtZXMoZmVtYWxlX2NlbGxzKQojIyBzdWJzZXQgb3VyIGNlbGwgZ3JvdXAgZGYgdG8ga2VlcCBvbmx5IHRoZXNlIGNlbGxzCmZlbWFsZV9jZWxsX2dyb3VwX2RmIDwtIGZlbWFsZV9jZWxsX2dyb3VwX2RmW3doaWNoKGZlbWFsZV9jZWxsX2dyb3VwX2RmJGNlbGxfaWQgJWluJSBmZW1hbGVfY2VsbHMpLF0KIyMgc3Vic2V0IFNldXJhdCBvYmplY3QgdG8gY29udGFpbiBjZWxscyBvZiBpbnRlcmVzdCAgCmZlbWFsZS5zZXVyYXQub2JqZWN0IDwtIFN1YnNldERhdGEodGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXgsIGNlbGxzID0gZmVtYWxlX2NlbGxzKQojIyBtYWtlIG5ldyBjb3VudHMgYW5kIHBoZW5vOgpkYXRhIDwtIGFzKGFzLm1hdHJpeChHZXRBc3NheURhdGEoZmVtYWxlLnNldXJhdC5vYmplY3QsIGFzc2F5ID0gIlJOQSIsIHNsb3QgPSAiZGF0YSIpKSwgJ3NwYXJzZU1hdHJpeCcpCnBkIDwtIGRhdGEuZnJhbWUoZmVtYWxlLnNldXJhdC5vYmplY3RAbWV0YS5kYXRhKQojIyBrZWVwIG9ubHkgdGhlIGNvbHVtbnMgdGhhdCBhcmUgcmVsZXZhbnQKI3BEYXRhIDwtIHBkICU+JSBzZWxlY3Qob3JpZy5pZGVudCwgbkNvdW50X1JOQSwgbkZlYXR1cmVfUk5BKQpmRGF0YSA8LSBkYXRhLmZyYW1lKGdlbmVfc2hvcnRfbmFtZSA9IHJvdy5uYW1lcyhkYXRhKSwgcm93Lm5hbWVzID0gcm93Lm5hbWVzKGRhdGEpKQojIyBDb25zdHJ1Y3QgbW9ub2NsZSBjZHMKZmVtYWxlLm1vbm9jbGUub2JqZWN0IDwtIG5ld19jZWxsX2RhdGFfc2V0KGV4cHJlc3Npb25fZGF0YSA9IGRhdGEsIGNlbGxfbWV0YWRhdGEgPSBwZCwgZ2VuZV9tZXRhZGF0YSA9IGZEYXRhKQojIyBwcmVwcm9jZXNzCmZlbWFsZS5tb25vY2xlLm9iamVjdCA9IHByZXByb2Nlc3NfY2RzKGZlbWFsZS5tb25vY2xlLm9iamVjdCwgbnVtX2RpbSA9IDUwLCBub3JtX21ldGhvZCA9ICJub25lIikgIAojIyBtYWtlIGEgbmV3IGRhdGFmcmFtZSBmb3IgY2VsbCBncm91cHMgLSBpdCBpcyBjcnVjaWFsIHRvIHJlZmFjdG9yIG90aGVyd2lzZSBhZ2dyZWdhdGVfZ2VuZV9leHByZXNzaW9uIHRoaW5rcyBpdCdzIG91dCBvZiBib3VuZHMgIApmZW1hbGVfY2VsbF9ncm91cF9kZiA8LSBkYXRhLmZyYW1lKGNlbGw9YXMuY2hhcmFjdGVyKGZhY3RvcihmZW1hbGVfY2VsbF9ncm91cF9kZiRjZWxsX2lkKSksIGNlbGxfZ3JvdXA9ZmFjdG9yKGZlbWFsZV9jZWxsX2dyb3VwX2RmJHB0X2JpbikpICAKIyMgYWdncmVnYXRlIGV4cHJlc3Npb24KZmVtYWxlX2FnZ19tYXQgPC0gYWdncmVnYXRlX2dlbmVfZXhwcmVzc2lvbihmZW1hbGUubW9ub2NsZS5vYmplY3QsIGdlbmVfbW9kdWxlX2RmX3NleCwgZmVtYWxlX2NlbGxfZ3JvdXBfZGYsIGV4Y2x1ZGUubmEgPSBGQUxTRSkKYGBgCgpgYGB7ciwgZmlnLmhlaWdodCA9IDcsIGZpZy53aWR0aCA9IDV9CiMjIHVzZSB0aGVzZSBjbHVzdGVycyB0byByZW9yZGVyIHRoZSBtb2R1bGVzCm1hbGVfYWdnX21hdCA8LSBtYWxlX2FnZ19tYXRbbWF0Y2gobGV2ZWxzKGdlbmVfbW9kdWxlX2RmX3NleCRtb2R1bGUpLCByb3cubmFtZXMobWFsZV9hZ2dfbWF0KSksIF0KZmVtYWxlX2FnZ19tYXQgPC0gZmVtYWxlX2FnZ19tYXRbbWF0Y2gobGV2ZWxzKGdlbmVfbW9kdWxlX2RmX3NleCRtb2R1bGUpLCByb3cubmFtZXMoZmVtYWxlX2FnZ19tYXQpKSwgXQoKcGhlYXRtYXA6OnBoZWF0bWFwKG1hbGVfYWdnX21hdCwgCiAgICAgICAgICAgICAgICAgICBzY2FsZT0icm93IiwKICAgICAgICAgICAgICAgICAgICNjbHVzdGVyaW5nX21ldGhvZD0id2FyZC5EMiIsCiAgICAgICAgICAgICAgICAgICBjbHVzdGVyX3Jvd3MgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJfY29scyA9IEZBTFNFKQoKcGhlYXRtYXA6OnBoZWF0bWFwKG1hbGVfYWdnX21hdCwgCiAgICAgICAgICAgICAgICAgICBzY2FsZT0iY29sdW1uIiwKICAgICAgICAgICAgICAgICAgICNjbHVzdGVyaW5nX21ldGhvZD0id2FyZC5EMiIsCiAgICAgICAgICAgICAgICAgICBjbHVzdGVyX3Jvd3MgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJfY29scyA9IEZBTFNFKQoKcGhlYXRtYXA6OnBoZWF0bWFwKG1hbGVfYWdnX21hdCwgCiAgICAgICAgICAgICAgICAgICBzY2FsZT0ibm9uZSIsCiAgICAgICAgICAgICAgICAgICAjY2x1c3RlcmluZ19tZXRob2Q9IndhcmQuRDIiLAogICAgICAgICAgICAgICAgICAgY2x1c3Rlcl9yb3dzID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICBjbHVzdGVyX2NvbHMgPSBGQUxTRSkKCnBoZWF0bWFwOjpwaGVhdG1hcChmZW1hbGVfYWdnX21hdCwgCiAgICAgICAgICAgICAgICAgICBzY2FsZT0icm93IiwKICAgICAgICAgICAgICAgICAgICNjbHVzdGVyaW5nX21ldGhvZD0id2FyZC5EMiIsCiAgICAgICAgICAgICAgICAgICBjbHVzdGVyX3Jvd3MgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJfY29scyA9IEZBTFNFKQoKcGhlYXRtYXA6OnBoZWF0bWFwKGZlbWFsZV9hZ2dfbWF0LCAKICAgICAgICAgICAgICAgICAgIHNjYWxlPSJjb2x1bW4iLAogICAgICAgICAgICAgICAgICAgI2NsdXN0ZXJpbmdfbWV0aG9kPSJ3YXJkLkQyIiwKICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgY2x1c3Rlcl9jb2xzID0gRkFMU0UpCgpwaGVhdG1hcDo6cGhlYXRtYXAoZmVtYWxlX2FnZ19tYXQsIAogICAgICAgICAgICAgICAgICAgc2NhbGU9Im5vbmUiLAogICAgICAgICAgICAgICAgICAgI2NsdXN0ZXJpbmdfbWV0aG9kPSJ3YXJkLkQyIiwKICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgY2x1c3Rlcl9jb2xzID0gRkFMU0UpCgpgYGAKCkNvbXBsZXhIZWF0bWFwIHZlcnNpb24KYGBge3IsIGZpZy5oZWlnaHQgPSAxMCwgZmlnLndpZHRoID0gMTJ9CiMjIHBoZWF0bWFwIGNhbGN1bGF0ZXMgWiBzY29yZXMgZm9yIHBsb3R0aW5nIHZhbHVlcwpzY2FsZV9tYXRyaXhfYnlfY29scyA8LSBmdW5jdGlvbiAoeCkgCnsKICAgIG0gPSBhcHBseSh4LCAxLCBtZWFuLCBuYS5ybSA9IFQpCiAgICBzID0gYXBwbHkoeCwgMSwgc2QsIG5hLnJtID0gVCkKICAgIHJldHVybigoeCAtIG0pL3MpCn0KCiMjIGNhbGN1bGF0ZSB6IHNjb3JlIGJ5IGNvbApmZW1hbGVfYWdnX21hdF9zY2FsZWQgPC0gdChhcy5tYXRyaXgoc2NhbGVfbWF0cml4X2J5X2NvbHModChmZW1hbGVfYWdnX21hdCkpKSkKbWFsZV9hZ2dfbWF0X3NjYWxlZCA8LSB0KGFzLm1hdHJpeChzY2FsZV9tYXRyaXhfYnlfY29scyh0KG1hbGVfYWdnX21hdCkpKSkKIyMgcmVvcmRlciBjb2xzCmZlbWFsZV9hZ2dfbWF0X3NjYWxlZCA8LSBmZW1hbGVfYWdnX21hdF9zY2FsZWRbbWF0Y2gobGV2ZWxzKGdlbmVfbW9kdWxlX2RmX3NleCRtb2R1bGUpLCByb3cubmFtZXMoZmVtYWxlX2FnZ19tYXRfc2NhbGVkKSksIF0KbWFsZV9hZ2dfbWF0X3NjYWxlZCA8LSBtYWxlX2FnZ19tYXRfc2NhbGVkW21hdGNoKGxldmVscyhnZW5lX21vZHVsZV9kZl9zZXgkbW9kdWxlKSwgcm93Lm5hbWVzKG1hbGVfYWdnX21hdF9zY2FsZWQpKSwgXQoKIyMgcmVvcmRlciBiYXNlZCBvbiBjbHVzdGVycwpnZW5lc19wZXJfbW9kdWxlIDwtIGdlbmVzX3Blcl9tb2R1bGVbbWF0Y2gobGV2ZWxzKGdlbmVfbW9kdWxlX2RmX3NleCRtb2R1bGUpLCByb3cubmFtZXMoZ2VuZXNfcGVyX21vZHVsZSkpLCBdCgojIyBjaGFuZ2UgbmFtZXMgZm9yIHJvdyBuYW1lcyB0byBpbmNsdWRlICJtb2R1bGUgIiBhdCB0aGUgYmVnaW5pbmcgb2YgdGhlbQpyb3cubmFtZXMoZmVtYWxlX2FnZ19tYXRfc2NhbGVkKSA8LSBzdHJpbmdyOjpzdHJfYygiTW9kdWxlICIsIHJvdy5uYW1lcyhmZW1hbGVfYWdnX21hdF9zY2FsZWQpKQpyb3cubmFtZXMobWFsZV9hZ2dfbWF0X3NjYWxlZCkgPC0gc3RyaW5ncjo6c3RyX2MoIk1vZHVsZSAiLCByb3cubmFtZXMobWFsZV9hZ2dfbWF0X3NjYWxlZCkpCgojIyBhZGQgbnVtYmVyIG9mIGNlbGxzIHRvIHRoZSByb3duYW1lcyBmb3IgdGhlIG1vZHVsZQpmb3IoaSBpbiBzZXFfYWxvbmcoZ2VuZXNfcGVyX21vZHVsZSRGcmVxKSl7CiAgcm93Lm5hbWVzKGZlbWFsZV9hZ2dfbWF0X3NjYWxlZClbaV0gPC0gc3RyaW5ncjo6c3RyX2Mocm93Lm5hbWVzKGZlbWFsZV9hZ2dfbWF0X3NjYWxlZClbaV0sIiAobiA9ICIgLGdlbmVzX3Blcl9tb2R1bGUkRnJlcVtpXSwgIikiKQp9CmZvcihpIGluIHNlcV9hbG9uZyhnZW5lc19wZXJfbW9kdWxlJEZyZXEpKXsKICByb3cubmFtZXMobWFsZV9hZ2dfbWF0X3NjYWxlZClbaV0gPC0gc3RyaW5ncjo6c3RyX2Mocm93Lm5hbWVzKG1hbGVfYWdnX21hdF9zY2FsZWQpW2ldLCIgKG4gPSAiICxnZW5lc19wZXJfbW9kdWxlJEZyZXFbaV0sICIpIikKfQoKIyMgYWRkIGFubm90YXRpb246CiNoZWF0bWFwX2Fubm90YXRpb24gPC0gSGVhdG1hcEFubm90YXRpb24oZGYgPSBjbHVzdGVyX2Fubm8sCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCA9IGxpc3QoCiMgSWRlbnRpdHkgPSBjKE1hbGU9IiMwMTZjMDAiLCBGZW1hbGU9IiNhNTJiMWUiLCBBc2V4dWFsPSAiIzAwNTJjNSIsIENvbW1pdHRlZCA9ICIjZjJlYjIzIikpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uX2xlZ2VuZF9wYXJhbSA9IGxpc3QoTWVkaWFuX1BzZXVkb3RpbWVfb2ZfQ2x1c3RlciA9IGxpc3QoZGlyZWN0aW9uID0gImhvcml6b250YWwiKSwgSWRlbnRpdHkgPSBsaXN0KG5yb3cgPSAxKSkpCgpsaWJyYXJ5KENvbXBsZXhIZWF0bWFwKQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKbW9kdWxlc19oZWF0bWFwX2ZlbWFsZSA8LSBIZWF0bWFwKGZlbWFsZV9hZ2dfbWF0X3NjYWxlZCwKICAgICAgICBjb2x1bW5fb3JkZXIgPSBOVUxMLAogICAgICAgICNyb3dfb3JkZXIgPSByb3cubmFtZXMoZmVtYWxlX2FnZ19tYXRfc2NhbGVkKVttb2R1bGVfZGVuZHJvJG9yZGVyXSwKICAgICAgICAjY2x1c3RlcmluZ19tZXRob2Rfcm93cyA9ICJ3YXJkLkQyIiwKICAgICAgICAjYm90dG9tX2Fubm90YXRpb24gPSBoZWF0bWFwX2Fubm90YXRpb24sCiAgICAgICAgY29sID0gY29sb3JSYW1wUGFsZXR0ZShyZXYoYnJld2VyLnBhbChuID0gNywgbmFtZSA9CiAgIlJkWWxCdSIpKSkoMTAwKSwgCiAgICAgICAgaGVhdG1hcF9sZWdlbmRfcGFyYW0gPSBsaXN0KGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikpCgptb2R1bGVzX2hlYXRtYXBfbWFsZSA8LSBIZWF0bWFwKG1hbGVfYWdnX21hdF9zY2FsZWQsCiAgICAgICAgY29sdW1uX29yZGVyID0gTlVMTCwKICAgICAgICAjcm93X29yZGVyID0gbW9kdWxlX2RlbmRybyRvcmRlciwKICAgICAgICAjY2x1c3RlcmluZ19tZXRob2Rfcm93cyA9ICJ3YXJkLkQyIiwKICAgICAgICAjYm90dG9tX2Fubm90YXRpb24gPSBoZWF0bWFwX2Fubm90YXRpb24sCiAgICAgICAgY29sID0gY29sb3JSYW1wUGFsZXR0ZShyZXYoYnJld2VyLnBhbChuID0gNywgbmFtZSA9CiAgIlJkWWxCdSIpKSkoMTAwKSwgCiAgICAgICAgaGVhdG1hcF9sZWdlbmRfcGFyYW0gPSBsaXN0KGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikpCgpkcmF3KG1vZHVsZXNfaGVhdG1hcF9mZW1hbGUsIG1lcmdlX2xlZ2VuZCA9IFRSVUUsIGhlYXRtYXBfbGVnZW5kX3NpZGUgPSAiYm90dG9tIiwgCiAgICBhbm5vdGF0aW9uX2xlZ2VuZF9zaWRlID0gImJvdHRvbSIpCmRyYXcobW9kdWxlc19oZWF0bWFwX21hbGUsIG1lcmdlX2xlZ2VuZCA9IFRSVUUsIGhlYXRtYXBfbGVnZW5kX3NpZGUgPSAiYm90dG9tIiwgCiAgICBhbm5vdGF0aW9uX2xlZ2VuZF9zaWRlID0gImJvdHRvbSIpCgojIyBodHRwczovL3d3dy5iaW9zdGFycy5vcmcvcC8zODA1NDQvIApgYGAKCjQgYmluIHdpZHRoIAoKYGBge3J9CiMjIERlZmluZSBtYWxlIGFuZCBmZW1hbGUgYnJhbmNoIGNlbGxzCiMgbWFsZQptYWxlX2JyYW5jaF9tZXRhX2RhdGEgPC0gdGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXhAbWV0YS5kYXRhW3doaWNoKHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YSRzZXggPT0gInByZS1kZXQiIHwgdGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXhAbWV0YS5kYXRhJHNleCA9PSAibWFsZSIpLCBdCgptYWxlX2JyYW5jaF9tZXRhX2RhdGEgPC0gZGF0YS5mcmFtZShjZWxsX2lkID0gcm93bmFtZXMobWFsZV9icmFuY2hfbWV0YV9kYXRhKSwgcHQgPSBtYWxlX2JyYW5jaF9tZXRhX2RhdGEkUFRfTGluZWFnZU1hbGUpCgptYWxlX2NlbGxfZ3JvdXBfZGYgPC0gbWFsZV9icmFuY2hfbWV0YV9kYXRhCgojZmVtYWxlCmZlbWFsZV9icmFuY2hfbWV0YV9kYXRhIDwtIHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YVt3aGljaCh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGEkc2V4ID09ICJwcmUtZGV0IiB8IHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YSRzZXggPT0gImZlbWFsZSIpLCBdCgpmZW1hbGVfYnJhbmNoX21ldGFfZGF0YSA8LSBkYXRhLmZyYW1lKGNlbGxfaWQgPSByb3duYW1lcyhmZW1hbGVfYnJhbmNoX21ldGFfZGF0YSksIHB0ID0gZmVtYWxlX2JyYW5jaF9tZXRhX2RhdGEkUFRfTGluZWFnZUZlbWFsZSkKCmZlbWFsZV9jZWxsX2dyb3VwX2RmIDwtIGZlbWFsZV9icmFuY2hfbWV0YV9kYXRhCgojIyB3aGF0J3MgdGhlIHJhbmdlIG9mIHZhbHVlcyBmb3IgZWFjaCBwdD8KCnJhbmdlKGZlbWFsZV9jZWxsX2dyb3VwX2RmJHB0KQpyYW5nZShtYWxlX2NlbGxfZ3JvdXBfZGYkcHQpCmBgYAoKCmBgYHtyfQojIyBtYWtlIGJpbiB3aWR0aHMKIyBtYWtlIGEgbmV3IGNvbCBmb3IgYW5ub3RhdGlvbgpmZW1hbGVfY2VsbF9ncm91cF9kZiRwdF9iaW4gPC0gTkEKZm9yKGkgaW4gc2VxKDQsNjgsNCkpewogIGZlbWFsZV9jZWxsX2dyb3VwX2RmJHB0X2Jpblt3aGljaChmZW1hbGVfY2VsbF9ncm91cF9kZiRwdCA8IGkgJiBmZW1hbGVfY2VsbF9ncm91cF9kZiRwdCA+PSAoaS00KSldIDwtIGkKfQoKbWFsZV9jZWxsX2dyb3VwX2RmJHB0X2JpbiA8LSBOQQpmb3IoaSBpbiBzZXEoNCw2OCw0KSl7CiAgbWFsZV9jZWxsX2dyb3VwX2RmJHB0X2Jpblt3aGljaChtYWxlX2NlbGxfZ3JvdXBfZGYkcHQgPCBpICYgbWFsZV9jZWxsX2dyb3VwX2RmJHB0ID49IChpLTQpKV0gPC0gaQp9CiMgdGhlbiByZW1vdmUgb2xkIHB0IHZhbHVlcwptYWxlX2NlbGxfZ3JvdXBfZGYgPC0gbWFsZV9jZWxsX2dyb3VwX2RmWyAsLTJdCmZlbWFsZV9jZWxsX2dyb3VwX2RmIDwtIGZlbWFsZV9jZWxsX2dyb3VwX2RmWyAsLTJdCmBgYAoKYGBge3J9CiMjIFRoZSBvcmlnaW5hbCBvYmplY3QgY29udGFpbnMgYWxsIGNlbGxzLCB3ZSBqdXN0IHdhbnQgd2lsZC10eXBlIHNvIGxldCdzIHN1YnNldCBvdXQgZ2VuZV9tb2R1bGVfZGYgYW5kIGNlbGxfZ3JvdXBfZGYgYWNjb3JkaW5nbHkKCiMjIG1hbGUKIyMgc3Vic2V0IG91ciBjZWxsIGdyb3VwIGRmIHRvIGtlZXAgb25seSB0aGVzZSBjZWxscwptYWxlX2NlbGxfZ3JvdXBfZGYgPC0gbWFsZV9jZWxsX2dyb3VwX2RmW3doaWNoKG1hbGVfY2VsbF9ncm91cF9kZiRjZWxsX2lkICVpbiUgbWFsZV9jZWxscyksXQojIyBtYWtlIGEgbmV3IGRhdGFmcmFtZSBmb3IgY2VsbCBncm91cHMgLSBpdCBpcyBjcnVjaWFsIHRvIHJlZmFjdG9yIG90aGVyd2lzZSBhZ2dyZWdhdGVfZ2VuZV9leHByZXNzaW9uIHRoaW5rcyBpdCdzIG91dCBvZiBib3VuZHMgIAptYWxlX2NlbGxfZ3JvdXBfZGYgPC0gZGF0YS5mcmFtZShjZWxsPWFzLmNoYXJhY3RlcihmYWN0b3IobWFsZV9jZWxsX2dyb3VwX2RmJGNlbGxfaWQpKSwgY2VsbF9ncm91cD1mYWN0b3IobWFsZV9jZWxsX2dyb3VwX2RmJHB0X2JpbikpICAKIyMgYWdncmVnYXRlIGV4cHJlc3Npb24KbWFsZV9hZ2dfbWF0IDwtIGFnZ3JlZ2F0ZV9nZW5lX2V4cHJlc3Npb24obWFsZS5tb25vY2xlLm9iamVjdCwgZ2VuZV9tb2R1bGVfZGZfc2V4LCBtYWxlX2NlbGxfZ3JvdXBfZGYsIGV4Y2x1ZGUubmEgPSBGQUxTRSkKCiMjIGZlbWFsZQojIyBzdWJzZXQgb3V0IG9ubHkgbWFsZSBhbmQgcHJlIGRldGVybWluYXRpb24gY2VsbHMKIyMgc3Vic2V0IG91ciBjZWxsIGdyb3VwIGRmIHRvIGtlZXAgb25seSB0aGVzZSBjZWxscwpmZW1hbGVfY2VsbF9ncm91cF9kZiA8LSBmZW1hbGVfY2VsbF9ncm91cF9kZlt3aGljaChmZW1hbGVfY2VsbF9ncm91cF9kZiRjZWxsX2lkICVpbiUgZmVtYWxlX2NlbGxzKSxdCiMjIG1ha2UgYSBuZXcgZGF0YWZyYW1lIGZvciBjZWxsIGdyb3VwcyAtIGl0IGlzIGNydWNpYWwgdG8gcmVmYWN0b3Igb3RoZXJ3aXNlIGFnZ3JlZ2F0ZV9nZW5lX2V4cHJlc3Npb24gdGhpbmtzIGl0J3Mgb3V0IG9mIGJvdW5kcyAgCmZlbWFsZV9jZWxsX2dyb3VwX2RmIDwtIGRhdGEuZnJhbWUoY2VsbD1hcy5jaGFyYWN0ZXIoZmFjdG9yKGZlbWFsZV9jZWxsX2dyb3VwX2RmJGNlbGxfaWQpKSwgY2VsbF9ncm91cD1mYWN0b3IoZmVtYWxlX2NlbGxfZ3JvdXBfZGYkcHRfYmluKSkgIAojIyBhZ2dyZWdhdGUgZXhwcmVzc2lvbgpmZW1hbGVfYWdnX21hdCA8LSBhZ2dyZWdhdGVfZ2VuZV9leHByZXNzaW9uKGZlbWFsZS5tb25vY2xlLm9iamVjdCwgZ2VuZV9tb2R1bGVfZGZfc2V4LCBmZW1hbGVfY2VsbF9ncm91cF9kZiwgZXhjbHVkZS5uYSA9IEZBTFNFKQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0ID0gNywgZmlnLndpZHRoID0gNX0KIyMgdXNlIHRoZXNlIGNsdXN0ZXJzIHRvIHJlb3JkZXIgdGhlIG1vZHVsZXMKbWFsZV9hZ2dfbWF0IDwtIG1hbGVfYWdnX21hdFttYXRjaChsZXZlbHMoZ2VuZV9tb2R1bGVfZGZfc2V4JG1vZHVsZSksIHJvdy5uYW1lcyhtYWxlX2FnZ19tYXQpKSwgXQpmZW1hbGVfYWdnX21hdCA8LSBmZW1hbGVfYWdnX21hdFttYXRjaChsZXZlbHMoZ2VuZV9tb2R1bGVfZGZfc2V4JG1vZHVsZSksIHJvdy5uYW1lcyhmZW1hbGVfYWdnX21hdCkpLCBdCgpwaGVhdG1hcDo6cGhlYXRtYXAobWFsZV9hZ2dfbWF0LCAKICAgICAgICAgICAgICAgICAgIHNjYWxlPSJyb3ciLAogICAgICAgICAgICAgICAgICAgI2NsdXN0ZXJpbmdfbWV0aG9kPSJ3YXJkLkQyIiwKICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgY2x1c3Rlcl9jb2xzID0gRkFMU0UpCgpwaGVhdG1hcDo6cGhlYXRtYXAoZmVtYWxlX2FnZ19tYXQsIAogICAgICAgICAgICAgICAgICAgc2NhbGU9InJvdyIsCiAgICAgICAgICAgICAgICAgICAjY2x1c3RlcmluZ19tZXRob2Q9IndhcmQuRDIiLAogICAgICAgICAgICAgICAgICAgY2x1c3Rlcl9yb3dzID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICBjbHVzdGVyX2NvbHMgPSBGQUxTRSkKCmBgYAoKCgojIyMjIGV4cHJlc3Npb24gb2YgbW9kdWxlcyBpbiBtdXRhbnQgY2VsbHMgKHNpZGUgcGFuZWxzKQoKbWFsZQpgYGB7cn0KIyMgbWFrZSBtb25vY2xlIG9iamVjdCB3aXRoIG11dGFudHMKIyMgZXh0cmFjdCBkYXRhCm11dGFudF9jZWxsc19tYWxlIDwtIHJvd25hbWVzKHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YVt3aGljaCh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGEkZ2Vub3R5cGVfY29tYmluZWQgPT0gIk11dGFudCIgJiB0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGEkc2V4ID09ICJtYWxlIiksXSkKCiMjIG1ha2UgYSBuZXcgU2V1cmF0IG9mIHRoaXMKc2V1cmF0Lm9iamVjdCA8LVN1YnNldERhdGEodGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXgsIGNlbGxzID0gbXV0YW50X2NlbGxzX21hbGUpCgojIyBtYWtlIG5ldyBjb3VudHMgYW5kIHBoZW5vOgojIyB0aGUgcmVhc29uIHdlIHVzZSB0aGUgaW50ZWdyYXRlZCBhbmQgdGhlbiBzdWJzZXR0ZWQgaXMgYmVjYXVzZSB0aGVzZSBjZWxscyBoYXZlIGJlZW4gbm9ybWFsaXNlZCB3aGVyZWFzIHRoZSBjZWxscyBpbiBwYl9zZXhfZmlsdGVyZWQgaGF2ZSBub3QgYmVlbiBub3JtYWxpc2VkICh3ZWxsIHRoZXkgaGF2ZSBidXQgd2l0aCBkb3VibGV0cyBpbiB0aGVtKQpkYXRhIDwtIGFzKGFzLm1hdHJpeChHZXRBc3NheURhdGEoc2V1cmF0Lm9iamVjdCwgYXNzYXkgPSAiUk5BIiwgc2xvdCA9ICJkYXRhIikpLCAnc3BhcnNlTWF0cml4JykKcGQgPC0gZGF0YS5mcmFtZShzZXVyYXQub2JqZWN0QG1ldGEuZGF0YSkKZkRhdGEgPC0gZGF0YS5mcmFtZShnZW5lX3Nob3J0X25hbWUgPSByb3cubmFtZXMoZGF0YSksIHJvdy5uYW1lcyA9IHJvdy5uYW1lcyhkYXRhKSkKCiMjIENvbnN0cnVjdCBtb25vY2xlIGNkcwptb25vY2xlLm9iamVjdC5tdXRhbnRzLm1hbGUgPC0gbmV3X2NlbGxfZGF0YV9zZXQoZXhwcmVzc2lvbl9kYXRhID0gZGF0YSwgY2VsbF9tZXRhZGF0YSA9IHBkLCBnZW5lX21ldGFkYXRhID0gZkRhdGEpCgojIyBwcmVwcm9jZXNzCm1vbm9jbGUub2JqZWN0Lm11dGFudHMubWFsZSA9IHByZXByb2Nlc3NfY2RzKG1vbm9jbGUub2JqZWN0Lm11dGFudHMubWFsZSwgbnVtX2RpbSA9IDUwLCBub3JtX21ldGhvZCA9ICJub25lIikKIyMjIGlmIHVzaW5nIGludGVncmF0ZWQgZGF0YToKIyBub3JtX21ldGhvZCA9ICJub25lIiwgYWxpZ25tZW50X2dyb3VwID0gIn4gZXhwZXJpbWVudCIKCiMjIG1ha2UgYSBjZWxsIGdyb3VwIGRhdGFmcmFtZSBmb3IgYWdncmVnYXRpbmcgZXhwcmVzc2lvbiB2YWx1ZXM6CgptdXRhbnRfY2VsbF9ncm91cF9kZiA8LSBkYXRhLmZyYW1lKGNlbGwgPSByb3cubmFtZXMobW9ub2NsZS5vYmplY3QubXV0YW50cy5tYWxlQGNvbERhdGEpLCBjZWxsX2dyb3VwID0gbW9ub2NsZS5vYmplY3QubXV0YW50cy5tYWxlQGNvbERhdGEkaWRlbnRpdHlfdXBkYXRlZCkKCiMjIGFnZ3JlZ2F0ZSBleHByZXNzaW9uCm11dGFudF9tYWxlX2FnZ19tYXQgPC0gYWdncmVnYXRlX2dlbmVfZXhwcmVzc2lvbihtb25vY2xlLm9iamVjdC5tdXRhbnRzLm1hbGUsIGdlbmVfbW9kdWxlX2RmX3NleCwgbXV0YW50X2NlbGxfZ3JvdXBfZGYpCmBgYAoKcGxvdApgYGB7ciwgZmlnLmhlaWdodCA9IDcsIGZpZy53aWR0aCA9IDV9Cm11dGFudF9tYWxlX2FnZ19tYXQgPC0gbXV0YW50X21hbGVfYWdnX21hdFttYXRjaChsZXZlbHMoZ2VuZV9tb2R1bGVfZGZfc2V4JG1vZHVsZSksIHJvdy5uYW1lcyhtdXRhbnRfbWFsZV9hZ2dfbWF0KSksIF0KCnBoZWF0bWFwOjpwaGVhdG1hcChtdXRhbnRfbWFsZV9hZ2dfbWF0LCAKICAgICAgICAgICAgICAgICAgIHNjYWxlPSJjb2x1bW4iLAogICAgICAgICAgICAgICAgICAgI2NsdXN0ZXJpbmdfbWV0aG9kPSJ3YXJkLkQyIiwKICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgY2x1c3Rlcl9jb2xzID0gVFJVRSkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikKYGBgCgpgYGB7ciwgZmlnLmhlaWdodCA9IDcsIGZpZy53aWR0aCA9IDV9Cm11dGFudF9tYWxlX2FnZ19tYXQgPC0gbXV0YW50X21hbGVfYWdnX21hdFttYXRjaChsZXZlbHMoZ2VuZV9tb2R1bGVfZGZfc2V4JG1vZHVsZSksIHJvdy5uYW1lcyhtdXRhbnRfbWFsZV9hZ2dfbWF0KSksIF0KCnBoZWF0bWFwOjpwaGVhdG1hcChtdXRhbnRfbWFsZV9hZ2dfbWF0LCAKICAgICAgICAgICAgICAgICAgIHNjYWxlPSJjb2x1bW4iLAogICAgICAgICAgICAgICAgICAgI2NsdXN0ZXJpbmdfbWV0aG9kPSJ3YXJkLkQyIiwKICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgY2x1c3Rlcl9jb2xzID0gVFJVRSkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikKYGBgCgpmZW1hbGUKYGBge3J9CiMjIG1ha2UgbW9ub2NsZSBvYmplY3Qgd2l0aCBtdXRhbnRzCiMjIGV4dHJhY3QgZGF0YQptdXRhbnRfY2VsbHNfZmVtYWxlIDwtIHJvd25hbWVzKHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YVt3aGljaCh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGEkZ2Vub3R5cGVfY29tYmluZWQgPT0gIk11dGFudCIgJiB0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGEkc2V4ID09ICJmZW1hbGUiKSxdKQoKIyMgbWFrZSBhIG5ldyBTZXVyYXQgb2YgdGhpcwpzZXVyYXQub2JqZWN0IDwtU3Vic2V0RGF0YSh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleCwgY2VsbHMgPSBtdXRhbnRfY2VsbHNfZmVtYWxlKQoKIyMgbWFrZSBuZXcgY291bnRzIGFuZCBwaGVubzoKIyMgdGhlIHJlYXNvbiB3ZSB1c2UgdGhlIGludGVncmF0ZWQgYW5kIHRoZW4gc3Vic2V0dGVkIGlzIGJlY2F1c2UgdGhlc2UgY2VsbHMgaGF2ZSBiZWVuIG5vcm1hbGlzZWQgd2hlcmVhcyB0aGUgY2VsbHMgaW4gcGJfc2V4X2ZpbHRlcmVkIGhhdmUgbm90IGJlZW4gbm9ybWFsaXNlZCAod2VsbCB0aGV5IGhhdmUgYnV0IHdpdGggZG91YmxldHMgaW4gdGhlbSkKZGF0YSA8LSBhcyhhcy5tYXRyaXgoR2V0QXNzYXlEYXRhKHNldXJhdC5vYmplY3QsIGFzc2F5ID0gIlJOQSIsIHNsb3QgPSAiZGF0YSIpKSwgJ3NwYXJzZU1hdHJpeCcpCnBkIDwtIGRhdGEuZnJhbWUoc2V1cmF0Lm9iamVjdEBtZXRhLmRhdGEpCmZEYXRhIDwtIGRhdGEuZnJhbWUoZ2VuZV9zaG9ydF9uYW1lID0gcm93Lm5hbWVzKGRhdGEpLCByb3cubmFtZXMgPSByb3cubmFtZXMoZGF0YSkpCgojIyBDb25zdHJ1Y3QgbW9ub2NsZSBjZHMKbW9ub2NsZS5vYmplY3QubXV0YW50cy5mZW1hbGUgPC0gbmV3X2NlbGxfZGF0YV9zZXQoZXhwcmVzc2lvbl9kYXRhID0gZGF0YSwgY2VsbF9tZXRhZGF0YSA9IHBkLCBnZW5lX21ldGFkYXRhID0gZkRhdGEpCgojIyBwcmVwcm9jZXNzCm1vbm9jbGUub2JqZWN0Lm11dGFudHMuZmVtYWxlID0gcHJlcHJvY2Vzc19jZHMobW9ub2NsZS5vYmplY3QubXV0YW50cy5mZW1hbGUsIG51bV9kaW0gPSA1MCwgbm9ybV9tZXRob2QgPSAibm9uZSIpCiMjIyBpZiB1c2luZyBpbnRlZ3JhdGVkIGRhdGE6CiMgbm9ybV9tZXRob2QgPSAibm9uZSIsIGFsaWdubWVudF9ncm91cCA9ICJ+IGV4cGVyaW1lbnQiCgojIyBtYWtlIGEgY2VsbCBncm91cCBkYXRhZnJhbWUgZm9yIGFnZ3JlZ2F0aW5nIGV4cHJlc3Npb24gdmFsdWVzOgptdXRhbnRfY2VsbF9ncm91cF9kZiA8LSBkYXRhLmZyYW1lKGNlbGwgPSByb3cubmFtZXMobW9ub2NsZS5vYmplY3QubXV0YW50cy5mZW1hbGVAY29sRGF0YSksIGNlbGxfZ3JvdXAgPSBtb25vY2xlLm9iamVjdC5tdXRhbnRzLmZlbWFsZUBjb2xEYXRhJGlkZW50aXR5X3VwZGF0ZWQpCgojIyBhZ2dyZWdhdGUgZXhwcmVzc2lvbgptdXRhbnRfZmVtYWxlX2FnZ19tYXQgPC0gYWdncmVnYXRlX2dlbmVfZXhwcmVzc2lvbihtb25vY2xlLm9iamVjdC5tdXRhbnRzLmZlbWFsZSwgZ2VuZV9tb2R1bGVfZGZfc2V4LCBtdXRhbnRfY2VsbF9ncm91cF9kZikKYGBgCgpwbG90CmBgYHtyLCBmaWcuaGVpZ2h0ID0gNywgZmlnLndpZHRoID0gNX0KbXV0YW50X2ZlbWFsZV9hZ2dfbWF0IDwtIG11dGFudF9mZW1hbGVfYWdnX21hdFttYXRjaChsZXZlbHMoZ2VuZV9tb2R1bGVfZGZfc2V4JG1vZHVsZSksIHJvdy5uYW1lcyhtdXRhbnRfZmVtYWxlX2FnZ19tYXQpKSwgXQoKcGhlYXRtYXA6OnBoZWF0bWFwKG11dGFudF9mZW1hbGVfYWdnX21hdCwgCiAgICAgICAgICAgICAgICAgICBzY2FsZT0iY29sdW1uIiwKICAgICAgICAgICAgICAgICAgICNjbHVzdGVyaW5nX21ldGhvZD0id2FyZC5EMiIsCiAgICAgICAgICAgICAgICAgICBjbHVzdGVyX3Jvd3MgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJfY29scyA9IEZBTFNFKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0ID0gNywgZmlnLndpZHRoID0gNX0KbXV0YW50X2ZlbWFsZV9hZ2dfbWF0IDwtIG11dGFudF9mZW1hbGVfYWdnX21hdFttYXRjaChsZXZlbHMoZ2VuZV9tb2R1bGVfZGZfc2V4JG1vZHVsZSksIHJvdy5uYW1lcyhtdXRhbnRfZmVtYWxlX2FnZ19tYXQpKSwgXQoKcGhlYXRtYXA6OnBoZWF0bWFwKG11dGFudF9mZW1hbGVfYWdnX21hdCwgCiAgICAgICAgICAgICAgICAgICBzY2FsZT0icm93IiwKICAgICAgICAgICAgICAgICAgICNjbHVzdGVyaW5nX21ldGhvZD0id2FyZC5EMiIsCiAgICAgICAgICAgICAgICAgICBjbHVzdGVyX3Jvd3MgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJfY29scyA9IFRSVUUpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpCmBgYAoKIyMjIyBmb3IgcGFydGljdWxhciBnZW5lcyAobG93ZXIgcGFuZWwpCgpgYGB7ciwgZmlnLmhlaWdodCA9IDIsIGZpZy53aWR0aCA9IDl9CiMjIGxhbmRtYXJrIGdlbmVzIChnZW5lcyBvZiBpbnRlcmVzdCkKIyBBUDJHIC0gUEJBTktBLTE0Mzc1MDAKIyBBUDIgLSBQQkFOS0EtMDkwOTYwMCAtIGZyb20gcG9yYW4gcGFwZXIKIyBBUDJHLTIgLSBQQkFOS0EtMTAzNDMwMCAKbGlzdF9vZl9tdXRhbnRfZ2VuZXMgPC0gYygiUEJBTktBLTA4MjgwMDAiLCAiUEJBTktBLTEzMDI3MDAiLCAiUEJBTktBLTE0NDc5MDAiLCAiUEJBTktBLTAxMDI0MDAiLCAiUEJBTktBLTA3MTY1MDAiLCAiUEJBTktBLTE0MzUyMDAiLCAiUEJBTktBLTE0MTgxMDAiLCAiUEJBTktBLTExNDQ4MDAiLCAiUEJBTktBLTA5MDIzMDAiLCAiUEJBTktBLTA0MTM0MDAiLCAiUEJBTktBLTE0NTQ4MDAiKQoKbGlzdF9vZl9nZW5lc19vZl9pbnRlcmVzdCA8LSBjKCJQQkFOS0EtMTQzNzUwMCIsICJQQkFOS0EtMDkwOTYwMCIsIlBCQU5LQS0xMDM0MzAwIiwgIlBCQU5LQS0wODI4MDAwIiwgIlBCQU5LQS0xMzAyNzAwIiwgIlBCQU5LQS0xNDQ3OTAwIiwgIlBCQU5LQS0wMTAyNDAwIiwgIlBCQU5LQS0wNzE2NTAwIiwgIlBCQU5LQS0xNDM1MjAwIiwgIlBCQU5LQS0xNDE4MTAwIiwgIlBCQU5LQS0xMTQ0ODAwIiwgIlBCQU5LQS0wOTAyMzAwIiwgIlBCQU5LQS0wNDEzNDAwIiwgIlBCQU5LQS0xNDU0ODAwIikKIyNtYWtlIGRmIGZvciBnZW5lcyBvZiBpbnRlcmVzdApnZW5lc19vZl9pbnRlcmVzdCA8LSBkYXRhLmZyYW1lKGdlbmUgPSBsaXN0X29mX2dlbmVzX29mX2ludGVyZXN0LCBncm91cCA9IGMoMTpsZW5ndGgobGlzdF9vZl9nZW5lc19vZl9pbnRlcmVzdCkpKQoKIyMgYWdncmVnYXRlIGV4cHJlc3Npb24KIyMgbWFrZSBwbG90dGluZyBkZgphZ2dfbWF0X2dlbmVzX29mX2ludGVyZXN0IDwtIGFnZ3JlZ2F0ZV9nZW5lX2V4cHJlc3Npb24obW9ub2NsZS5vYmplY3QsIGdlbmVzX29mX2ludGVyZXN0LCBjZWxsX2dyb3VwX2RmKQoKcm93Lm5hbWVzKGFnZ19tYXRfZ2VuZXNfb2ZfaW50ZXJlc3QpIDwtIGdlbmVzX29mX2ludGVyZXN0JGdlbmUKCiNyb3cubmFtZXMoYWdnX21hdF9nZW5lc19vZl9pbnRlcmVzdCkgPC0gZmFjdG9yKHJvdy5uYW1lcyhhZ2dfbWF0X2dlbmVzX29mX2ludGVyZXN0KSwgbGV2ZWxzID0gcm93Lm5hbWVzKGFnZ19tYXRfZ2VuZXNfb2ZfaW50ZXJlc3QpW21vZHVsZV9kZW5kcm8kb3JkZXJdKQphZ2dfbWF0X2dlbmVzX29mX2ludGVyZXN0IDwtIGFnZ19tYXRfZ2VuZXNfb2ZfaW50ZXJlc3RbLG1hdGNoKHJvd25hbWVzKGNsdXN0ZXJfYW5ubyksIGNvbG5hbWVzKGFnZ19tYXRfZ2VuZXNfb2ZfaW50ZXJlc3QpKV0KCnBoZWF0bWFwOjpwaGVhdG1hcChhZ2dfbWF0X2dlbmVzX29mX2ludGVyZXN0LCAKICAgICAgICAgICAgICAgICAgIHNjYWxlPSJyb3ciLAogICAgICAgICAgICAgICAgICAgY2x1c3Rlcl9jb2xzID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICBjbHVzdGVyX3Jvd3MgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJpbmdfbWV0aG9kPSJ3YXJkLkQyIiwgCiAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uX2NvbCA9IGNsdXN0ZXJfYW5ubywgCiAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uX2NvbG9ycyA9IGFubm90YXRpb25fY29sb3VycykKYGBgCgpjb21wbGV4IGhlYXQgbWFwCgpgYGB7cn0KIyMgYWdncmVnYXRlIGdlbmUgZXhwcmVzc2lvbgphZ2dfbWF0X2dlbmVzX29mX2ludGVyZXN0IDwtIGFnZ3JlZ2F0ZV9nZW5lX2V4cHJlc3Npb24obW9ub2NsZS5vYmplY3QsIGdlbmVzX29mX2ludGVyZXN0LCBkZl9hbGxfY2VsbHMpCgphZ2dfbWF0X2dlbmVzX29mX2ludGVyZXN0IDwtIGFzLm1hdHJpeChhZ2dfbWF0X2dlbmVzX29mX2ludGVyZXN0KQoKIyMgbWFrZSBoZWF0bWFwCm1vZHVsZXNfaGVhdG1hcCA8LSBIZWF0bWFwKGFnZ19tYXRfZ2VuZXNfb2ZfaW50ZXJlc3QsCiAgICAgICAgY29sdW1uX29yZGVyID0gTlVMTCwKICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBGQUxTRSwKICAgICAgICBjbHVzdGVyX3Jvd3MgPSBGQUxTRSwKICAgICAgICBzaG93X2NvbHVtbl9kZW5kID0gRkFMU0UsCiAgICAgICAgY29sdW1uX2xhYmVscyA9IHJlcCgiIiwgbmNvbChhZ2dfbWF0X2FsbF9jZWxsc19tYXRyaXgpKSwKICAgICAgICAjcm93X29yZGVyID0gbW9kdWxlX2RlbmRybyRvcmRlciwKICAgICAgICBjbHVzdGVyaW5nX21ldGhvZF9jb2x1bW5zID0gIndhcmQuRDIiLAogICAgICAgIGJvdHRvbV9hbm5vdGF0aW9uID0gaGVhdG1hcF9hbm5vdGF0aW9uLAogICAgICAgIGNvbCA9IGNvbG9yUmFtcFBhbGV0dGUocmV2KGJyZXdlci5wYWwobiA9IDcsIG5hbWUgPQogICJSZFlsQnUiKSkpKDEwMCksIAogICAgICAgIGhlYXRtYXBfbGVnZW5kX3BhcmFtID0gbGlzdChkaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpKQoKIyMgcHJpbnQKZHJhdyhtb2R1bGVzX2hlYXRtYXAsIG1lcmdlX2xlZ2VuZCA9IFRSVUUsIGhlYXRtYXBfbGVnZW5kX3NpZGUgPSAiYm90dG9tIiwgCiAgICBhbm5vdGF0aW9uX2xlZ2VuZF9zaWRlID0gImJvdHRvbSIpCmBgYAoKYGBge3J9CiMjIG9yZGVyIGNvbHMgaW4gdGhlIG1hdHJpeAphZ2dfbWF0X2dlbmVzX29mX2ludGVyZXN0IDwtIGFnZ19tYXRfZ2VuZXNfb2ZfaW50ZXJlc3RbICxtYXRjaChyb3duYW1lcyhkZl9hbm5vKSwgY29sbmFtZXMoYWdnX21hdF9nZW5lc19vZl9pbnRlcmVzdCkpXQoKIyMgbWFrZSBoZWF0bWFwCm1vZHVsZXNfaGVhdG1hcCA8LSBIZWF0bWFwKGFnZ19tYXRfZ2VuZXNfb2ZfaW50ZXJlc3QsCiAgICAgICAgY29sdW1uX29yZGVyID0gTlVMTCwKICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBUUlVFLAogICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLAogICAgICAgIHNob3dfY29sdW1uX2RlbmQgPSBGQUxTRSwKICAgICAgICBjb2x1bW5fbGFiZWxzID0gcmVwKCIiLCBuY29sKGFnZ19tYXRfYWxsX2NlbGxzX21hdHJpeCkpLAogICAgICAgICNyb3dfb3JkZXIgPSBtb2R1bGVfZGVuZHJvJG9yZGVyLAogICAgICAgIGNsdXN0ZXJpbmdfbWV0aG9kX2NvbHVtbnMgPSAid2FyZC5EMiIsCiAgICAgICAgYm90dG9tX2Fubm90YXRpb24gPSBoZWF0bWFwX2Fubm90YXRpb24sCiAgICAgICAgY29sID0gY29sb3JSYW1wUGFsZXR0ZShyZXYoYnJld2VyLnBhbChuID0gNywgbmFtZSA9CiAgIlJkWWxCdSIpKSkoMTAwKSwgCiAgICAgICAgaGVhdG1hcF9sZWdlbmRfcGFyYW0gPSBsaXN0KGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikpCgojIyBwcmludApkcmF3KG1vZHVsZXNfaGVhdG1hcCwgbWVyZ2VfbGVnZW5kID0gVFJVRSwgaGVhdG1hcF9sZWdlbmRfc2lkZSA9ICJib3R0b20iLCAKICAgIGFubm90YXRpb25fbGVnZW5kX3NpZGUgPSAiYm90dG9tIikKYGBgCgpVc2luZyBTZXVyYXQgdG8gdmlzdWFsaXNlIGNlbGxzCmBgYHtyfQojIGZpbmQgbWFya2VycyBmb3IgZXZlcnkgY2x1c3RlciBjb21wYXJlZCB0byBhbGwgcmVtYWluaW5nIGNlbGxzLCByZXBvcnQgb25seSB0aGUgcG9zaXRpdmUgb25lcwp0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleC5tYXJrZXJzIDwtIEZpbmRBbGxNYXJrZXJzKHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4LCBvbmx5LnBvcyA9IFRSVUUsIG1pbi5wY3QgPSAwLjI1LCBsb2dmYy50aHJlc2hvbGQgPSAwLjI1KQp0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleC5tYXJrZXJzICU+JSBncm91cF9ieShjbHVzdGVyKSAlPiUgdG9wX24obiA9IDIsIHd0ID0gYXZnX2xvZ0ZDKQpgYGAKCmBgYHtyfQp0b3AxMCA8LSB0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleC5tYXJrZXJzICU+JSBncm91cF9ieShjbHVzdGVyKSAlPiUgdG9wX24obiA9IDEwLCB3dCA9IGF2Z19sb2dGQykKRG9IZWF0bWFwKHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4LCBmZWF0dXJlcyA9IHRvcDEwJGdlbmUpICsgTm9MZWdlbmQoKQpgYGAKCkJ1dCB3ZSBhbHNvIGhhdmUgdGhlIG9sZCBwdCB2YWx1ZXMgdGhhdCB3ZSBjYW4gdXNlIGluIHRoZSBzZXVyYXQgb2JqZWN0IGllIEZlYXR1cmVQbG90KHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4LCByZWR1Y3Rpb24gPSAicGNhIiwgcHQuc2l6ZSA9IDAuMDEsIGZlYXR1cmVzID0gIm9sZF9wdF92YWx1ZXMiKQoKU28gbGV0J3MgcGxvdCBhIGhlYXRtYXAgd2hlcmUgd2UgcGxvdDogKHgpIGFsbCBjZWxscyB2cy4gKHkpIGdlbmVzIGFycmFuZ2VkIGJ5IG1vZHVsZSB0aGF0IHRoZXkgYmVsb25nIHRvLiAKCmFkZCBhbiBvbGQgcHQgYW5ub3RhdGlvbiB0byB0aGUgdG9wCgpwcmVwYXJlIGRhdGE6CmBgYHtyfQojIyBleHRyYWN0cyBvbmx5IDEweCBjZWxscyAKd3RfY2VsbHMgPC0gcm93bmFtZXModGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXhAbWV0YS5kYXRhW3doaWNoKHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YSRpZGVudGl0eV9jb21iaW5lZCA9PSAiV1RfMTBYIiksXSkKCiMjIG1ha2UgYSBuZXcgU2V1cmF0IG9mIHRoaXMKc2V1cmF0Lm9iamVjdCA8LVN1YnNldERhdGEodGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXgsIGNlbGxzID0gd3RfY2VsbHMpCmBgYAoKYGBge3J9CkRvSGVhdG1hcChzZXVyYXQub2JqZWN0LCBmZWF0dXJlcyA9IHRvcDEwJGdlbmUpICsgTm9MZWdlbmQoKQpgYGAKCgoKCmBgYHtyfQojIyBhZ2dyZWdhdGUgZ2VuZSBleHByZXNzaW9uCmFnZ19tYXRfZ2VuZXNfb2ZfaW50ZXJlc3QgPC0gYWdncmVnYXRlX2dlbmVfZXhwcmVzc2lvbihtb25vY2xlLm9iamVjdCwgZ2VuZXNfb2ZfaW50ZXJlc3QsIGRmX2FsbF9jZWxscykKCmFnZ19tYXRfZ2VuZXNfb2ZfaW50ZXJlc3QgPC0gYXMubWF0cml4KGFnZ19tYXRfZ2VuZXNfb2ZfaW50ZXJlc3QpCgojIyBtYWtlIGhlYXRtYXAKbW9kdWxlc19oZWF0bWFwIDwtIEhlYXRtYXAoYWdnX21hdF9nZW5lc19vZl9pbnRlcmVzdCwKICAgICAgICBjb2x1bW5fb3JkZXIgPSBOVUxMLAogICAgICAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLAogICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLAogICAgICAgIHNob3dfY29sdW1uX2RlbmQgPSBGQUxTRSwKICAgICAgICBjb2x1bW5fbGFiZWxzID0gcmVwKCIiLCBuY29sKGFnZ19tYXRfYWxsX2NlbGxzX21hdHJpeCkpLAogICAgICAgICNyb3dfb3JkZXIgPSBtb2R1bGVfZGVuZHJvJG9yZGVyLAogICAgICAgIGNsdXN0ZXJpbmdfbWV0aG9kX2NvbHVtbnMgPSAid2FyZC5EMiIsCiAgICAgICAgYm90dG9tX2Fubm90YXRpb24gPSBoZWF0bWFwX2Fubm90YXRpb24sCiAgICAgICAgY29sID0gY29sb3JSYW1wUGFsZXR0ZShyZXYoYnJld2VyLnBhbChuID0gNywgbmFtZSA9CiAgIlJkWWxCdSIpKSkoMTAwKSwgCiAgICAgICAgaGVhdG1hcF9sZWdlbmRfcGFyYW0gPSBsaXN0KGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikpCgojIyBwcmludApkcmF3KG1vZHVsZXNfaGVhdG1hcCwgbWVyZ2VfbGVnZW5kID0gVFJVRSwgaGVhdG1hcF9sZWdlbmRfc2lkZSA9ICJib3R0b20iLCAKICAgIGFubm90YXRpb25fbGVnZW5kX3NpZGUgPSAiYm90dG9tIikKYGBgCgpFeHByZXNzaW9uIG9mIENDUDIgYW5kIE1HMSBieSBlYWNoIGdlbm90eXBlIGFuZCBlYWNoIHNleAoKYGBge3J9CiMgY2NwMiAtICJQQkFOS0EtMTMxOTUwMCIgLSBmZW1hbGUgODIwCiMgTUcxIC0gIlBCQU5LQS0wNDE2MTAwIiAtIG1hbGUgODIwCgojIyBtYWtlIGEgY3VzdG9tIGRhdGFmcmFtZToKbWFya2VyXzgyMF9kZiA8LSBhcy5kYXRhLmZyYW1lKHQoYXMuZGF0YS5mcmFtZSh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBhc3NheXMkUk5BQGRhdGFbYygiUEJBTktBLTEzMTk1MDAiLCAiUEJBTktBLTA0MTYxMDAiKSwgXSwgc3RyaW5nc0FzRmFjdG9ycz1GKSkpCm1hcmtlcl84MjBfZGYkY2VsbF9pZCA8LSByb3cubmFtZXMobWFya2VyXzgyMF9kZikKc2V4X2lkIDwtIGRhdGEuZnJhbWUoc2V4X2F0ID0gdGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXhAbWV0YS5kYXRhJGF0X3NleCwgZ2Vub3R5cGUgPSB0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGEkaWRlbnRpdHlfdXBkYXRlZCAsY2VsbF9pZCA9IHJvdy5uYW1lcyh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGEpKQptYXJrZXJfODIwX2RmIDwtIG1lcmdlKG1hcmtlcl84MjBfZGYsIHNleF9pZCwgYnkgPSAiY2VsbF9pZCIpCgpnZ3Bsb3QobWFya2VyXzgyMF9kZiwgYWVzKGZpbGw9c2V4X2F0LCB5PWBQQkFOS0EtMTMxOTUwMGAsIHg9Z2Vub3R5cGUpKSArIAogICAgZ2VvbV92aW9saW4oKSArCiAgZ2VvbV9qaXR0ZXIoc2hhcGU9MTYsIHBvc2l0aW9uPXBvc2l0aW9uX2ppdHRlcigwLjIpKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKYGBgCgpgYGB7cn0KI3RlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YVt3aGljaCh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGEkc2V4ID09ICJwcmUtZGV0IiB8IHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YSRzZXggPT0gImZlbWFsZSIpLCBdCgoKVmxuUGxvdCh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleCwgZ3JvdXAuYnkgPSAiaWRlbnRpdHlfdXBkYXRlZCIsIHNwbGl0LmJ5ID0gImF0X3NleCIsIGZlYXR1cmVzID0gYygiUEJBTktBLTEzMTk1MDAiKSwgc3BsaXQucGxvdCA9IFRSVUUpCgpWbG5QbG90KHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4LCBncm91cC5ieSA9ICJpZGVudGl0eV91cGRhdGVkIiwgc3BsaXQuYnkgPSAiYXRfc2V4IiwgZmVhdHVyZXMgPSBjKCJQQkFOS0EtMDQxNjEwMCIpLCBzcGxpdC5wbG90ID0gVFJVRSkKYGBgCgpEaWZmZXJlbnRpYWwgZXhwcmVzc2lvbgoKUmUtY2x1c3RlciB0aGUgZGF0YSBzbyB3ZSBoYXZlIHZlcnkgY291cnNlIGdyYWluIGNsdXN0ZXJzCmBgYHtyfQojIyBmaW5kIG5ldyBjbHVzdGVycwp0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleCA8LSBGaW5kQ2x1c3RlcnModGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXgsIHJlc29sdXRpb24gPSAxLCByYW5kb20uc2VlZCA9IDQyLCBhbGdvcml0aG0gPSAyKQoKIyMgcGxvdCB0aGUgZ3JhcGgKRGltUGxvdCh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleCwgcmVkdWN0aW9uID0gInVtYXBvcHRpbWlzZWRfcG9zdF9yZXBjYSIsIGxhYmVsID0gVFJVRSwgcmVwZWwgPSBUUlVFLCBsYWJlbC5zaXplID0gNSwgcHQuc2l6ZSA9IDAuNSwgZ3JvdXAuYnkgPSAiaW50ZWdyYXRlZF9zbm5fcmVzLjEiKSArCiAgY29vcmRfZml4ZWQoKSArCiAgdGhlbWVfdm9pZCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogIGd1aWRlcyhjb2xvdXI9Z3VpZGVfbGVnZW5kKG5yb3c9MyxieXJvdz1UUlVFLCBvdmVycmlkZS5hZXMgPSBsaXN0KHNpemU9NCkpKQpgYGAKCmBgYHtyfQpWbG5QbG90KHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4LCBmZWF0dXJlcyA9IGMoIlBUX0ZlbWFsZV9VTUFQIiwgIlBUX01hbGVfVU1BUCIpKQpgYGAKCiMjIyMgU2hvdyByZXByZXNlbnRhdGlvbiBvZiBnZW5vdHlwZXMgcGVyIGNsdXN0ZXIKCnByZXAgZm9yIGRvdHBsb3QKYGBge3J9CiMjIG1ha2UgYSBkYXRhZnJhbWUgdGhhdCBpcyB0aGUgbWV0YSBkYXRhCmRmX21ldGFfZGF0YSA8LSBhcy5kYXRhLmZyYW1lKHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YSkKCiMjIGRlZmluZSBvcmRlciBmb3IgcGxvdHRpbmcgCm15X2xldmVsc19zZXggPC0gYygiMiIsICIzIiwgIjkiLCAiNiIsICIxMSIsICI1IiwgIjAiLCAiMTAiLCAiMTMiLCAiMTQiLCAiMTIiLCAiOCIsICIxNSIsICIxIiwgIjQiLCAiNyIpCgojIyByZWRlZmluZSBvcmRlciBvZiBjbHVzdGVyczoKZGZfbWV0YV9kYXRhJHNldXJhdF9jbHVzdGVycyA8LSBmYWN0b3IoeCA9IGRmX21ldGFfZGF0YSRzZXVyYXRfY2x1c3RlcnMsIGxldmVscyA9IG15X2xldmVsc19zZXgpCgojIyBtYWtlIGEgbmV3IGRmIG9mIENMVVNURVIgYW5kIElERU5USVRZCmRvdF9wbG90X2RmIDwtIGFzLmRhdGEuZnJhbWUubWF0cml4KHRhYmxlKGRmX21ldGFfZGF0YSRzZXVyYXRfY2x1c3RlcnMsIGRmX21ldGFfZGF0YSRpZGVudGl0eV9jb21iaW5lZCkpCmRvdF9wbG90X2RmJGNsdXN0ZXIgPC0gcm93bmFtZXMoZG90X3Bsb3RfZGYpCgojIyBjYWxjdWxhdGUgcGVyY2VudGFnZSBvZiBjZWxscyBmb3IgZWFjaCBnZW5vdHlwZQpkb3RfcGxvdF9kZl9wYyA8LSAoYXMuZGF0YS5mcmFtZS5tYXRyaXgocHJvcC50YWJsZSh0YWJsZShkZl9tZXRhX2RhdGEkc2V1cmF0X2NsdXN0ZXJzLCBkZl9tZXRhX2RhdGEkaWRlbnRpdHlfY29tYmluZWQpLCBtYXJnaW4gPSAyKSkgKiAxMDApCgojIyBtYWtlIGEgY29sdW1uIGZvciBjbHVzdGVyIG5hbWVzCmRvdF9wbG90X2RmX3BjJGNsdXN0ZXIgPC0gcm93bmFtZXMoZG90X3Bsb3RfZGZfcGMpCgojIyBtZWx0IGRhdGFmcmFtZSBmb3IgcGxvdHRpbmcKbGlicmFyeShyZXNoYXBlMikKZG90X3Bsb3RfZGZfcGNfbWVsdGVkIDwtIG1lbHQoZG90X3Bsb3RfZGZfcGMsIHZhcmlhYmxlLm5hbWUgPSAiY2x1c3RlciIpCmNvbG5hbWVzKGRvdF9wbG90X2RmX3BjX21lbHRlZClbMl0gPC0gImlkZW50aXR5IgoKIyMgbWVsdCB0aGUgcmF3IG51bWJlciB0b28KZG90X3Bsb3RfZGZfbWVsdGVkIDwtIG1lbHQoZG90X3Bsb3RfZGYsIHZhcmlhYmxlLm5hbWUgPSAiY2x1c3RlciIpCmNvbG5hbWVzKGRvdF9wbG90X2RmX21lbHRlZClbMl0gPC0gImlkZW50aXR5Igpjb2xuYW1lcyhkb3RfcGxvdF9kZl9tZWx0ZWQpWzNdIDwtICJyYXdfbnVtYmVyIgoKIyMgbWVyZ2UgdG9nZXRoZXIKaWRlbnRpY2FsKGRvdF9wbG90X2RmX21lbHRlZCRjbHVzdGVyLCBkb3RfcGxvdF9kZl9wY19tZWx0ZWQkY2x1c3RlcikKZG90X3Bsb3RfbWVyZ2VkIDwtIGNiaW5kKGRvdF9wbG90X2RmX21lbHRlZCwgZG90X3Bsb3RfZGZfcGNfbWVsdGVkKQpkb3RfcGxvdF9tZXJnZWQgPC0gZG90X3Bsb3RfbWVyZ2VkWyxjKDEsMiwzLDYpXQoKIyMgcmVkZWZpbmUgb3JkZXIgb2YgY2x1c3RlcnMKZG90X3Bsb3RfbWVyZ2VkJGNsdXN0ZXIgPC0gZmFjdG9yKHggPSBkb3RfcGxvdF9tZXJnZWQkY2x1c3RlciwgbGV2ZWxzID0gbXlfbGV2ZWxzX3NleCkKCiMjIHdoZXJlIHZhbHVlcyBhcmUgemVybywgYWRkIE5BCiMjIGZpbmQgd2VsbHMgd2hlcmUgaXQncyB6ZXJvCnplcm9fdmFsdWVzIDwtIGRvdF9wbG90X21lcmdlZCR2YWx1ZSA9PSAwCmRvdF9wbG90X21lcmdlZCR2YWx1ZVt6ZXJvX3ZhbHVlc10gPC0gTkEKCiMjIGFsc28gZG8gZm9yIHJhdyBudW1iZXIKemVyb192YWx1ZXMgPC0gZG90X3Bsb3RfbWVyZ2VkJHJhd19udW1iZXIgPT0gMApkb3RfcGxvdF9tZXJnZWQkcmF3X251bWJlclt6ZXJvX3ZhbHVlc10gPC0gTkEKCiMjIHJlb3JkZXIgeCBheGlzOgpteV9sZXZlbHNfZ2Vub3R5cGUgPC0gYygiR0NTS08tb29tIiwgIkdDU0tPLTI5IiwgIkdDU0tPLTIiLCAiR0NTS08tMTkiLCAiR0NTS08tMyIsICJHQ1NLTy0yMSIsICJHQ1NLTy0xMyIsICJHQ1NLTy0yOCIsICJHQ1NLTy0xMF84MjAiLCAiR0NTS08tMTciLCAiR0NTS08tMjAiLCAiV1QiLCAiV1RfMTBYIikKCmRvdF9wbG90X21lcmdlZCRpZGVudGl0eSA8LSBmYWN0b3IoeCA9IGRvdF9wbG90X21lcmdlZCRpZGVudGl0eSwgbGV2ZWxzID0gbXlfbGV2ZWxzX2dlbm90eXBlKQpgYGAKCnBsb3QKYGBge3IsIGZpZy53aWR0aCA9IDYsIGZpZy5oZWlnaHQ9IDd9CiMjIHBsb3QKZG90X3Bsb3RfaWRlbnRpdHkgPC0gZ2dwbG90KGRvdF9wbG90X21lcmdlZCwgYWVzKHkgPSBmYWN0b3IoY2x1c3RlciksIHggPSBmYWN0b3IoaWRlbnRpdHkpKSkgKwogICAgICAjIyBtYWtlIGludG8gYSBkb3QgcGxvdAogICAgICBnZW9tX3BvaW50KGFlcyhjb2xvdXI9dmFsdWUsIHNpemU9cmF3X251bWJlcikpICsgCiAgICAgIHNjYWxlX2NvbG9yX2dyYWRpZW50KGxvdz0iYmx1ZSIsIGhpZ2g9InJlZCIsIGxpbWl0cz1jKCAwLCBtYXgoZG90X3Bsb3RfZGZfcGNfbWVsdGVkJHZhbHVlKSksIG5hLnZhbHVlPSJ3aGl0ZSIpICsKICAgICAgI2NoYW5nZSB0aGUgY29sb3VycwogICAgICBzY2FsZV9jb2xvdXJfdmlyaWRpcyhvcHRpb24gPSAiaW5mZXJubyIsIGd1aWRlID0gImNvbG91cmJhciIsIG5hLnZhbHVlPSJ3aGl0ZSIpICsKICAgICAgdGhlbWVfY2xhc3NpYygpICsKICAgICAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvcj1lbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3I9ZWxlbWVudF9ibGFuaygpLCB0ZXh0PWVsZW1lbnRfdGV4dChzaXplPTE2LCAgZmFtaWx5PSJBcmlhbCIpKSArCiAgICAgIHlsYWIoIkNsdXN0ZXIiKSArCiAgICAgIHhsYWIoIklkZW50aXR5IikgKwogICAgICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT0xMiwgYW5nbGU9NDUsIGhqdXN0PTEsIHZqdXN0PTEpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT0xMiwpLCBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgcGxvdC5tYXJnaW4gPSB1bml0KGMoMSwzLDEsMyksICJsaW5lcyIpKSArCiAgICAjIyBhbm5vdGF0ZSBtYWxlcwogICAgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdCA9IDIuNSkpICsKICAgICMjIGFubm90YXRlIGZlbWFsZXMKICAgIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQgPSA3LjUpKSArCiAgICAjIyBhbm5vdGF0ZSBwaGVubyAxCiAgICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0ID0gNC41KSkgKwogICAgIyMgYW5ub3RhdGUgcGhlbm8gMgogICAgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdCA9IDUuNSkpICsgICAgCiAgICAjIyBhbm5vdGF0ZSBwaGVubyAzCiAgICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0ID0gNy41KSkgKwogICAgIyMgYW5ub3RhdGUgcGhlbm8gNAogICAgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdCA9IDExLjUpKQoKIyMgcHJpbnQKcHJpbnQoZG90X3Bsb3RfaWRlbnRpdHkpCmBgYAoKCgoKY3V0IG9mZiBhbmQgcGxvdApgYGB7cn0KcHJlX2JyYW5jaF9jZWxscyA8LSBjKDIsMykKaW5tYXR1cmVfbWFsZV9jZWxscyA8LSBjKCkKaW5tYXR1cmVfZmVtYWxlX2NlbGxzIDwtCm1hdHVyZV9tYWxlX2NlbGxzIDwtIAptYXR1cmVfZmVtYWxlX2NlbGxzIDwtIAoKIyMgcGxvdCB0aGUgZ3JhcGgKRGltUGxvdCh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleCwgcmVkdWN0aW9uID0gInVtYXBvcHRpbWlzZWRfcG9zdF9yZXBjYSIsIGxhYmVsID0gVFJVRSwgcmVwZWwgPSBUUlVFLCBsYWJlbC5zaXplID0gNSwgcHQuc2l6ZSA9IDAuNSwgZ3JvdXAuYnkgPSAiaW50ZWdyYXRlZF9zbm5fcmVzLjEiKSArCiAgY29vcmRfZml4ZWQoKSArCiAgdGhlbWVfdm9pZCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikKYGBgCgoKCmBgYHtyfQp3dF9jZWxscyA8LSByb3cubmFtZXModGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXhAbWV0YS5kYXRhW3doaWNoKHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YSRpZGVudGl0eV9jb21iaW5lZCA9PSAiV1QiIHwgdGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXhAbWV0YS5kYXRhJGlkZW50aXR5X2NvbWJpbmVkID09ICJXVF8xMFgiKSwgXSkKCm1hbGVfaW5tYXR1cmVfY2VsbHMgPC0gcm93Lm5hbWVzKHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YVt3aGljaCh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGEkaWRlbnRpdHlfY29tYmluZWQgPT0gIldUIiB8IHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YSRpZGVudGl0eV9jb21iaW5lZCA9PSAiV1RfMTBYIiksIF0pCgoKCmVhcmx5X3d0X2NlbGxzIDwtIHJvdy5uYW1lcyh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGFbd2hpY2godGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXhAbWV0YS5kYXRhJGlkZW50aXR5X2NvbWJpbmVkID09ICJXVCIgJiYgdGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXhAbWV0YS5kYXRhJFBUX0xpbmVhZ2VGZW1hbGUgPCA0NiksIF0pCgpGaW5kTWFya2Vycyh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleCwgY2VsbHMuMSA9ICwgY2VsbHMuMiA9ICkKYGBgCgojIyMgR2VuZXJhdGUgTmV3IENsdXN0ZXJzCgpXZSBtdXN0IG5vdyByZWNhbGN1bGF0ZSB0aGUgY2x1c3RlcnMgdG8gZ2FpbiBhIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIHRoZSBoZXRlcm9nZW5laXR5IG9mIHRoZSBzdWJzZXQuIFNpbmNlIHVzaW5nIHRoZSBwcmV2aW91cyBjbHVzdGVycywgdGhlIGFzZXh1YWwgY2VsbHMgb2JzY3VyZWQgc29tZSBvZiB0aGUgdmFyaWF0aW9uLiAKCmBgYHtyfQojIyBjb3B5IG9sZCBjbHVzdGVycwp0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleCA8LSBBZGRNZXRhRGF0YSh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleCwgdGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXhAbWV0YS5kYXRhJHNldXJhdF9jbHVzdGVycywgY29sLm5hbWUgPSAicHJlX3NleF9jbHVzdGVycyIpCmBgYAoKYGBge3J9CiMjIGdlbmVyYXRlIG5ldyBjbHVzdGVycyBhdCB2YXJpb3VzIHJlc29sdXRpb25zCnRlbngubXV0YW50LmludGVncmF0ZWQuc2V4IDwtIEZpbmROZWlnaGJvcnModGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXgsIGRpbXMgPSAxOjE1KQp0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleCA8LSBGaW5kQ2x1c3RlcnModGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXgsIHJlc29sdXRpb24gPSBjKDIsMyw0LDUsNiksIHJhbmRvbS5zZWVkID0gNDIsIGFsZ29yaXRobSA9IDIpCmBgYAoKIyMjIFZpc3VhbGlzZQoKIyMjIyBDaG9vc2UgQ2x1c3RlciBSZXNvbHV0aW9uCgpWaWV3IHRoZSBjbHVzdGVycyBhdCBkaWZmZXJlbnQgcmVzb2x1dGlvbnMgdG8gY2hvc2UgdGhlIGFwcHJvcHJhaXRlIHJlc29sdXRpb24KYGBge3J9CiMjIHBsb3QKRGltUGxvdCh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleCwgcmVkdWN0aW9uID0gInVtYXBvcHRpbWlzZWRfcG9zdF9yZXBjYSIsIGxhYmVsID0gVFJVRSwgcmVwZWwgPSBUUlVFLCBsYWJlbC5zaXplID0gNSwgcHQuc2l6ZSA9IDAuNSwgZ3JvdXAuYnkgPSAiaW50ZWdyYXRlZF9zbm5fcmVzLjIiKSArCiAgY29vcmRfZml4ZWQoKSArCiAgdGhlbWVfdm9pZCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogIGd1aWRlcyhjb2xvdXI9Z3VpZGVfbGVnZW5kKG5yb3c9MyxieXJvdz1UUlVFLCBvdmVycmlkZS5hZXMgPSBsaXN0KHNpemU9NCkpKQoKRGltUGxvdCh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleCwgcmVkdWN0aW9uID0gInVtYXBvcHRpbWlzZWRfcG9zdF9yZXBjYSIsIGxhYmVsID0gVFJVRSwgcmVwZWwgPSBUUlVFLCBsYWJlbC5zaXplID0gNSwgcHQuc2l6ZSA9IDAuNSwgZ3JvdXAuYnkgPSAiaW50ZWdyYXRlZF9zbm5fcmVzLjMiKSArCiAgY29vcmRfZml4ZWQoKSArCiAgdGhlbWVfdm9pZCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogIGd1aWRlcyhjb2xvdXI9Z3VpZGVfbGVnZW5kKG5yb3c9MyxieXJvdz1UUlVFLCBvdmVycmlkZS5hZXMgPSBsaXN0KHNpemU9NCkpKQoKRGltUGxvdCh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleCwgcmVkdWN0aW9uID0gInVtYXBvcHRpbWlzZWRfcG9zdF9yZXBjYSIsIGxhYmVsID0gVFJVRSwgcmVwZWwgPSBUUlVFLCBsYWJlbC5zaXplID0gNSwgcHQuc2l6ZSA9IDAuNSwgZ3JvdXAuYnkgPSAiaW50ZWdyYXRlZF9zbm5fcmVzLjQiKSArCiAgY29vcmRfZml4ZWQoKSArCiAgdGhlbWVfdm9pZCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogIGd1aWRlcyhjb2xvdXI9Z3VpZGVfbGVnZW5kKG5yb3c9MyxieXJvdz1UUlVFLCBvdmVycmlkZS5hZXMgPSBsaXN0KHNpemU9NCkpKQoKRGltUGxvdCh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleCwgcmVkdWN0aW9uID0gInVtYXBvcHRpbWlzZWRfcG9zdF9yZXBjYSIsIGxhYmVsID0gVFJVRSwgcmVwZWwgPSBUUlVFLCBsYWJlbC5zaXplID0gNSwgcHQuc2l6ZSA9IDAuNSwgZ3JvdXAuYnkgPSAiaW50ZWdyYXRlZF9zbm5fcmVzLjUiKSArCiAgY29vcmRfZml4ZWQoKSArCiAgdGhlbWVfdm9pZCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogIGd1aWRlcyhjb2xvdXI9Z3VpZGVfbGVnZW5kKG5yb3c9MyxieXJvdz1UUlVFLCBvdmVycmlkZS5hZXMgPSBsaXN0KHNpemU9NCkpKQoKRGltUGxvdCh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleCwgcmVkdWN0aW9uID0gInVtYXBvcHRpbWlzZWRfcG9zdF9yZXBjYSIsIGxhYmVsID0gVFJVRSwgcmVwZWwgPSBUUlVFLCBsYWJlbC5zaXplID0gNSwgcHQuc2l6ZSA9IDAuNSwgZ3JvdXAuYnkgPSAiaW50ZWdyYXRlZF9zbm5fcmVzLjYiKSArCiAgY29vcmRfZml4ZWQoKSArCiAgdGhlbWVfdm9pZCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogIGd1aWRlcyhjb2xvdXI9Z3VpZGVfbGVnZW5kKG5yb3c9MyxieXJvdz1UUlVFLCBvdmVycmlkZS5hZXMgPSBsaXN0KHNpemU9NCkpKQpgYGAKCkdvIHdpdGggNCBjbHVzdGVycwpgYGB7cn0KdGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXggPC0gRmluZENsdXN0ZXJzKHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4LCByZXNvbHV0aW9uID0gNCwgcmFuZG9tLnNlZWQgPSA0MiwgYWxnb3JpdGhtID0gMikKCkRpbVBsb3QodGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXgsIHJlZHVjdGlvbiA9ICJ1bWFwb3B0aW1pc2VkX3Bvc3RfcmVwY2EiLCBsYWJlbCA9IFRSVUUsIHJlcGVsID0gVFJVRSwgbGFiZWwuc2l6ZSA9IDUsIHB0LnNpemUgPSAwLjUpICsKICBjb29yZF9maXhlZCgpICsKICB0aGVtZV92b2lkKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArCiAgZ3VpZGVzKGNvbG91cj1ndWlkZV9sZWdlbmQobnJvdz0zLGJ5cm93PVRSVUUsIG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZT00KSkpCmBgYAoKIyMjIyBPcmlnaW5hbCBVTUFQCgpZb3UgY2FuIGFsc28gdXNlIHRoZSBvcmlnaW5hbCBVTUFQIHByb2plY3Rpb24KYGBge3IsIGZpZy5oZWlnaHQgPSA3LCBmaWcud2lkdGggPSA3fQpEaW1QbG90KHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4LCBsYWJlbCA9IFRSVUUsIHJlcGVsID0gVFJVRSwgbGFiZWwuc2l6ZSA9IDUsIHB0LnNpemUgPSAwLjUpICsKICBjb29yZF9maXhlZCgpICsKICB0aGVtZV92b2lkKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArCiAgZ3VpZGVzKGNvbG91cj1ndWlkZV9sZWdlbmQobnJvdz0zLGJ5cm93PVRSVUUsIG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZT00KSkpCmBgYAoKIyMjIyBSZXByZXNlbnRhdGlvbgoKbG9vayBhdCBjbHVzdGVyIHJlcHJlc2VudGF0aW9uCmBgYHtyLCBlY2hvID0gRkFMU0V9CiMjIGZvciBsb29wIHdoaWNoIHRha2VzIGVhY2ggY2x1c3RlciBhbmQgbWFrZXMgYSBsaXN0IG9mIGNlbGxzIGFuZCB0aGVuIHBsb3RzIGEgaGlnaGxpZ2h0ZWQgcGxvdCBhbmQgYWRkcyBpdCB0byBhIGxpc3QKCiMjIG1ha2UgYSBkZiBvZiB0aGUgbnVtYmVyIG9mIApuX3Blcl9jbHVzdGVyIDwtIGFzLmRhdGEuZnJhbWUodGFibGUodGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXhAbWV0YS5kYXRhJHNldXJhdF9jbHVzdGVycykpCnJvd25hbWVzKG5fcGVyX2NsdXN0ZXIpIDwtIG5fcGVyX2NsdXN0ZXIkVmFyMQpuX3Blcl9jbHVzdGVyIDwtIG5fcGVyX2NsdXN0ZXJbLDJdCgojIyBtYWtlIGEgYmxhbmsgbGlzdApsaXN0X1VNQVBzX2J5X2NsdXN0ZXIgPC0gdmVjdG9yKG1vZGUgPSAibGlzdCIsIGxlbmd0aCA9IGxlbmd0aChsZXZlbHModGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXhAbWV0YS5kYXRhJHNldXJhdF9jbHVzdGVycykpKQoKIyMgZm9yIGxvb3AKZm9yKGkgaW4gc2VxX2Fsb25nKGxldmVscyh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGEkc2V1cmF0X2NsdXN0ZXJzKSkpewogICMjIG1ha2UgYSBsaXN0IG9mIGNlbGxzCiAgbGlzdF9vZl9jZWxscyA8LSByb3duYW1lcyh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGFbd2hpY2godGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXhAbWV0YS5kYXRhJHNldXJhdF9jbHVzdGVycyA9PSBsZXZlbHModGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXhAbWV0YS5kYXRhJHNldXJhdF9jbHVzdGVycylbaV0pLCBdKQogIHVtYXBfcGxvdCA8LSBEaW1QbG90KHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4LCBsYWJlbCA9IEZBTFNFLCByZXBlbCA9IFRSVUUsIHB0LnNpemUgPSAwLjEsIGNlbGxzLmhpZ2hsaWdodCA9IGxpc3Rfb2ZfY2VsbHMsIHJlZHVjdGlvbiA9ICJ1bWFwb3B0aW1pc2VkX3Bvc3RfcmVwY2EiKSArIAogIGNvb3JkX2ZpeGVkKCkgKyAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiMwMDAwMDAiLCAiI2Y1NGUxZSIpKSArIAogIHRoZW1lX3ZvaWQoKSArIAogIGxhYnModGl0bGUgPSBwYXN0ZSgiY2x1c3RlciIsIGxldmVscyh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGEkc2V1cmF0X2NsdXN0ZXJzKVtpXSwgIlxuIiwgIihuID0gIiwgbl9wZXJfY2x1c3RlcltpXSwiKSIpKSArIAogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLCBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCiAgIyMgYWRkIHRvIHRoZSBsaXN0CiAgbGlzdF9VTUFQc19ieV9jbHVzdGVyW1tpXV0gPC0gdW1hcF9wbG90Cn0KYGBgCgpwbG90CmBgYHtyfQojIyB0aGlzIGZ1bmN0aW9uIHdyaXRlcyB0aGUgbmV4dCBiaXQgb2YgY29kZSBmb3IgeW91CnBsb3R5IDwtIGMoKQpmb3IoaSBpbiBzZXFfYWxvbmcobGV2ZWxzKHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YSRzZXVyYXRfY2x1c3RlcnMpKSl7CiAgcGxvdHkgPC0gcGFzdGUwKHBsb3R5LCAibGlzdF9VTUFQc19ieV9jbHVzdGVyW1siLCBpLCAiXV0iLCAiICsgIikKfQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0ID0gMTUsIGZpZy53aWR0aCA9IDIwfQojIyBwbG90CmxpYnJhcnkoZ3JpZEV4dHJhKQpncmlkLmFycmFuZ2UobGlzdF9VTUFQc19ieV9jbHVzdGVyW1sxXV0gLCBsaXN0X1VNQVBzX2J5X2NsdXN0ZXJbWzJdXSAsIGxpc3RfVU1BUHNfYnlfY2x1c3RlcltbM11dICwgbGlzdF9VTUFQc19ieV9jbHVzdGVyW1s0XV0gLCBsaXN0X1VNQVBzX2J5X2NsdXN0ZXJbWzVdXSAsIGxpc3RfVU1BUHNfYnlfY2x1c3RlcltbNl1dICwgbGlzdF9VTUFQc19ieV9jbHVzdGVyW1s3XV0gLCBsaXN0X1VNQVBzX2J5X2NsdXN0ZXJbWzhdXSAsIGxpc3RfVU1BUHNfYnlfY2x1c3RlcltbOV1dICwgbGlzdF9VTUFQc19ieV9jbHVzdGVyW1sxMF1dICwgbGlzdF9VTUFQc19ieV9jbHVzdGVyW1sxMV1dICwgbGlzdF9VTUFQc19ieV9jbHVzdGVyW1sxMl1dICwgbGlzdF9VTUFQc19ieV9jbHVzdGVyW1sxM11dICwgbGlzdF9VTUFQc19ieV9jbHVzdGVyW1sxNF1dICwgbGlzdF9VTUFQc19ieV9jbHVzdGVyW1sxNV1dICwgbGlzdF9VTUFQc19ieV9jbHVzdGVyW1sxNl1dICwgbGlzdF9VTUFQc19ieV9jbHVzdGVyW1sxN11dICwgbGlzdF9VTUFQc19ieV9jbHVzdGVyW1sxOF1dICwgbGlzdF9VTUFQc19ieV9jbHVzdGVyW1sxOV1dICwgbGlzdF9VTUFQc19ieV9jbHVzdGVyW1syMF1dICwgbGlzdF9VTUFQc19ieV9jbHVzdGVyW1syMV1dICwgbGlzdF9VTUFQc19ieV9jbHVzdGVyW1syMl1dICwgbGlzdF9VTUFQc19ieV9jbHVzdGVyW1syM11dICwgbGlzdF9VTUFQc19ieV9jbHVzdGVyW1syNF1dICwgbGlzdF9VTUFQc19ieV9jbHVzdGVyW1syNV1dICwgbGlzdF9VTUFQc19ieV9jbHVzdGVyW1syNl1dICwgbGlzdF9VTUFQc19ieV9jbHVzdGVyW1syN11dICwgbGlzdF9VTUFQc19ieV9jbHVzdGVyW1syOF1dICwgbGlzdF9VTUFQc19ieV9jbHVzdGVyW1syOV1dICwgbGlzdF9VTUFQc19ieV9jbHVzdGVyW1szMF1dICwgbGlzdF9VTUFQc19ieV9jbHVzdGVyW1szMV1dLCBuY29sID0gNSkKYGBgCgoKYGBge3J9CiMjIGZvciBsb29wIHdoaWNoIHRha2VzIGVhY2ggY2x1c3RlciBhbmQgbWFrZXMgYSBsaXN0IG9mIGNlbGxzIGFuZCB0aGVuIHBsb3RzIGEgaGlnaGxpZ2h0ZWQgcGxvdCBhbmQgYWRkcyBpdCB0byBhIGxpc3QKCiMjIG1ha2UgYSBkZiBvZiB0aGUgbnVtYmVyIG9mIApuX3Blcl9jbHVzdGVyIDwtIGFzLmRhdGEuZnJhbWUodGFibGUodGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXhAbWV0YS5kYXRhJHNldXJhdF9jbHVzdGVycykpCnJvd25hbWVzKG5fcGVyX2NsdXN0ZXIpIDwtIG5fcGVyX2NsdXN0ZXIkVmFyMQpuX3Blcl9jbHVzdGVyIDwtIG5fcGVyX2NsdXN0ZXJbLDJdCgojIyBtYWtlIGEgYmxhbmsgbGlzdApsaXN0X1VNQVBzX2J5X2NsdXN0ZXIgPC0gdmVjdG9yKG1vZGUgPSAibGlzdCIsIGxlbmd0aCA9IGxlbmd0aChsZXZlbHModGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXhAbWV0YS5kYXRhJHNldXJhdF9jbHVzdGVycykpKQoKIyMgZm9yIGxvb3AKZm9yKGkgaW4gc2VxX2Fsb25nKGxldmVscyh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGEkc2V1cmF0X2NsdXN0ZXJzKSkpewogICMjIG1ha2UgYSBsaXN0IG9mIGNlbGxzCiAgbGlzdF9vZl9jZWxscyA8LSByb3duYW1lcyh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGFbd2hpY2godGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXhAbWV0YS5kYXRhJHNldXJhdF9jbHVzdGVycyA9PSBsZXZlbHModGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXhAbWV0YS5kYXRhJHNldXJhdF9jbHVzdGVycylbaV0pLCBdKQogIHVtYXBfcGxvdCA8LSBEaW1QbG90KHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4LCAgcmVkdWN0aW9uID0gInVtYXAiLCBsYWJlbCA9IEZBTFNFLCByZXBlbCA9IFRSVUUsIHB0LnNpemUgPSAwLjEsIGNlbGxzLmhpZ2hsaWdodCA9IGxpc3Rfb2ZfY2VsbHMpICsgCiAgY29vcmRfZml4ZWQoKSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiIzAwMDAwMCIsICIjZjU0ZTFlIikpICsgCiAgdGhlbWVfdm9pZCgpICsgCiAgbGFicyh0aXRsZSA9IHBhc3RlKCJjbHVzdGVyIiwgbGV2ZWxzKHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YSRzZXVyYXRfY2x1c3RlcnMpW2ldLCAiXG4iLCAiKG4gPSAiLCBuX3Blcl9jbHVzdGVyW2ldLCIpIikpICsgCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKICAjIyBhZGQgdG8gdGhlIGxpc3QKICBsaXN0X1VNQVBzX2J5X2NsdXN0ZXJbW2ldXSA8LSB1bWFwX3Bsb3QKfQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0ID0gMTUsIGZpZy53aWR0aCA9IDIwfQojIyBwbG90CmdyaWQuYXJyYW5nZShsaXN0X1VNQVBzX2J5X2NsdXN0ZXJbWzFdXSAsIGxpc3RfVU1BUHNfYnlfY2x1c3RlcltbMl1dICwgbGlzdF9VTUFQc19ieV9jbHVzdGVyW1szXV0gLCBsaXN0X1VNQVBzX2J5X2NsdXN0ZXJbWzRdXSAsIGxpc3RfVU1BUHNfYnlfY2x1c3RlcltbNV1dICwgbGlzdF9VTUFQc19ieV9jbHVzdGVyW1s2XV0gLCBsaXN0X1VNQVBzX2J5X2NsdXN0ZXJbWzddXSAsIGxpc3RfVU1BUHNfYnlfY2x1c3RlcltbOF1dICwgbGlzdF9VTUFQc19ieV9jbHVzdGVyW1s5XV0gLCBsaXN0X1VNQVBzX2J5X2NsdXN0ZXJbWzEwXV0gLCBsaXN0X1VNQVBzX2J5X2NsdXN0ZXJbWzExXV0gLCBsaXN0X1VNQVBzX2J5X2NsdXN0ZXJbWzEyXV0gLCBsaXN0X1VNQVBzX2J5X2NsdXN0ZXJbWzEzXV0gLCBsaXN0X1VNQVBzX2J5X2NsdXN0ZXJbWzE0XV0gLCBsaXN0X1VNQVBzX2J5X2NsdXN0ZXJbWzE1XV0gLCBsaXN0X1VNQVBzX2J5X2NsdXN0ZXJbWzE2XV0gLCBsaXN0X1VNQVBzX2J5X2NsdXN0ZXJbWzE3XV0gLCBsaXN0X1VNQVBzX2J5X2NsdXN0ZXJbWzE4XV0gLCBsaXN0X1VNQVBzX2J5X2NsdXN0ZXJbWzE5XV0gLCBsaXN0X1VNQVBzX2J5X2NsdXN0ZXJbWzIwXV0gLCBsaXN0X1VNQVBzX2J5X2NsdXN0ZXJbWzIxXV0gLCBsaXN0X1VNQVBzX2J5X2NsdXN0ZXJbWzIyXV0gLCBsaXN0X1VNQVBzX2J5X2NsdXN0ZXJbWzIzXV0gLCBsaXN0X1VNQVBzX2J5X2NsdXN0ZXJbWzI0XV0gLCBsaXN0X1VNQVBzX2J5X2NsdXN0ZXJbWzI1XV0gLCBsaXN0X1VNQVBzX2J5X2NsdXN0ZXJbWzI2XV0gLCBsaXN0X1VNQVBzX2J5X2NsdXN0ZXJbWzI3XV0gLCBsaXN0X1VNQVBzX2J5X2NsdXN0ZXJbWzI4XV0gLCBsaXN0X1VNQVBzX2J5X2NsdXN0ZXJbWzI5XV0gLCBsaXN0X1VNQVBzX2J5X2NsdXN0ZXJbWzMwXV0gLCBsaXN0X1VNQVBzX2J5X2NsdXN0ZXJbWzMxXV0sIG5jb2wgPSA1KQpgYGAKCiMjIyMgU2hvdyBjb3JyZXNwb25kYW5jZSB3aXRoIG9sZCBjbHVzdGVycyAoQWxsdXZpdW0gcGxvdCwgU2Fua2V5IGRpYWdyYW0pCgpgYGB7cn0KIyNUaGlzIGlzIHRoZSBzZXQgdXAgZm9yIHRoaXM6CiMjIHR3byBjbHVzdGVycyB0aGF0IGRpZmZlcgp0YWJsZSh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGEkc2V1cmF0X2NsdXN0ZXJzLCB0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGEkcHJlX3NleF9jbHVzdGVycykKYGBgCgpgYGB7cn0KIyMgaGVtYmVyZyB1c2VzIGd2aXNTYW5rZXkgaW4gaHR0cHM6Ly9naXRodWIuY29tL2hlbWJlcmctbGFiL3NjbWFwL2Jsb2IvM2FhMmJiNDg3YTgwYTk0NjQ2OTM5Mzg1N2NlYTZhNmVmZmM2MThmYi9SL1V0aWxzLlIgY29kZSAtIHNvIG1heWJlIHVwZGF0ZSB3aXRoIHRoaXM/CgojIyBtYWtlIGEgZGF0YWZyYW1lIHRoYXQgaXMgdGhlIG1ldGEgZGF0YQpkZl9tZXRhX2RhdGEgPC0gYXMuZGF0YS5mcmFtZSh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGEpCgpkZl9hbGx1dmlhbCA8LSBtZWx0KHRhYmxlKGRhdGEuZnJhbWUoZnVsbF9jbHVzdGVycyA9IGRmX21ldGFfZGF0YSRwcmVfc2V4X2NsdXN0ZXJzLCBzZXhfY2x1c3RlcnMgPSBkZl9tZXRhX2RhdGEkc2V1cmF0X2NsdXN0ZXJzKSkpCgojIyBsb2FkIHJlcXVpcmVkIHBhY2thZ2UKI2xpYnJhcnkoZ2dhbGx1dmlhbCkKCiMjIHBsb3QKZ2dwbG90KGRmX2FsbHV2aWFsLCBhZXMoeSA9IHZhbHVlLCBheGlzMSA9IGZ1bGxfY2x1c3RlcnMsIGF4aXMyID0gc2V4X2NsdXN0ZXJzKSkgKwogIGdlb21fYWxsdXZpdW0oYWVzKGZpbGwgPSBzZXhfY2x1c3RlcnMpLAogICAgICAgICAgICAgICAgd2lkdGggPSAwLCBrbm90LnBvcyA9IDAsIHJldmVyc2UgPSBGQUxTRSkgKwogIGd1aWRlcyhmaWxsID0gRkFMU0UpICsKICBnZW9tX3N0cmF0dW0od2lkdGggPSAxLzgsIHJldmVyc2UgPSBGQUxTRSkgKwogIGdlb21fdGV4dChzdGF0ID0gInN0cmF0dW0iLCBpbmZlci5sYWJlbCA9IFRSVUUsIHJldmVyc2UgPSBGQUxTRSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSAxOjIsIGxhYmVscyA9IGMoIm9yaWdpbmFsIGNsdXN0ZXIiLCAiU2V4IENsdXN0ZXIiKSkgKwogIGNvb3JkX2ZsaXAoKSArCiAgZ2d0aXRsZSgiQ2x1c3RlciBJZGVudGlpdHkgaW4gZnVsbCBkYXRhc2V0IHZzLiBzZXggb25seSIpICsKICAgIHRoZW1lX2NsYXNzaWMoKQpgYGAKCiMjIyMgU2hvdyByZXByZXNlbnRhdGlvbiBvZiBnZW5vdHlwZXMgcGVyIGNsdXN0ZXIKCnByZXAgZm9yIGRvdHBsb3QKYGBge3J9CiMjIG1ha2UgYSBkYXRhZnJhbWUgdGhhdCBpcyB0aGUgbWV0YSBkYXRhCmRmX21ldGFfZGF0YSA8LSBhcy5kYXRhLmZyYW1lKHRlbngubXV0YW50LmludGVncmF0ZWQuc2V4QG1ldGEuZGF0YSkKCiMjIGRlZmluZSBvcmRlciBmb3IgcGxvdHRpbmcgCm15X2xldmVsc19zZXggPC0gYygiMCIsICI5IiwgIjI4IiwgIjIiLCAiMjkiLCAiMTYiLCAiMjIiLCAiMjMiLCAiMTUiLCAiMjEiLCAiMzAiLCAiNCIsICIzIiwgIjE4IiwgIjciLCAiOCIsICI2IiwgIjIwIiwgIjEyIiwgIjI2IiwgIjEzIiwgIjUiLCAiMTEiLCAiMjUiLCAiMSIsICIxNyIsICIxMCIsICIyNCIsICIxNCIsICIyNyIsICIxOSIpCgojIyByZWRlZmluZSBvcmRlciBvZiBjbHVzdGVyczoKZGZfbWV0YV9kYXRhJHNldXJhdF9jbHVzdGVycyA8LSBmYWN0b3IoeCA9IGRmX21ldGFfZGF0YSRzZXVyYXRfY2x1c3RlcnMsIGxldmVscyA9IG15X2xldmVsc19zZXgpCgojIyBtYWtlIGEgbmV3IGRmIG9mIENMVVNURVIgYW5kIElERU5USVRZCmRvdF9wbG90X2RmIDwtIGFzLmRhdGEuZnJhbWUubWF0cml4KHRhYmxlKGRmX21ldGFfZGF0YSRzZXVyYXRfY2x1c3RlcnMsIGRmX21ldGFfZGF0YSRpZGVudGl0eV9jb21iaW5lZCkpCmRvdF9wbG90X2RmJGNsdXN0ZXIgPC0gcm93bmFtZXMoZG90X3Bsb3RfZGYpCgojIyBjYWxjdWxhdGUgcGVyY2VudGFnZSBvZiBjZWxscyBmb3IgZWFjaCBnZW5vdHlwZQpkb3RfcGxvdF9kZl9wYyA8LSAoYXMuZGF0YS5mcmFtZS5tYXRyaXgocHJvcC50YWJsZSh0YWJsZShkZl9tZXRhX2RhdGEkc2V1cmF0X2NsdXN0ZXJzLCBkZl9tZXRhX2RhdGEkaWRlbnRpdHlfY29tYmluZWQpLCBtYXJnaW4gPSAyKSkgKiAxMDApCgojIyBtYWtlIGEgY29sdW1uIGZvciBjbHVzdGVyIG5hbWVzCmRvdF9wbG90X2RmX3BjJGNsdXN0ZXIgPC0gcm93bmFtZXMoZG90X3Bsb3RfZGZfcGMpCgojIyBtZWx0IGRhdGFmcmFtZSBmb3IgcGxvdHRpbmcKbGlicmFyeShyZXNoYXBlMikKZG90X3Bsb3RfZGZfcGNfbWVsdGVkIDwtIG1lbHQoZG90X3Bsb3RfZGZfcGMsIHZhcmlhYmxlLm5hbWUgPSAiY2x1c3RlciIpCmNvbG5hbWVzKGRvdF9wbG90X2RmX3BjX21lbHRlZClbMl0gPC0gImlkZW50aXR5IgoKIyMgbWVsdCB0aGUgcmF3IG51bWJlciB0b28KZG90X3Bsb3RfZGZfbWVsdGVkIDwtIG1lbHQoZG90X3Bsb3RfZGYsIHZhcmlhYmxlLm5hbWUgPSAiY2x1c3RlciIpCmNvbG5hbWVzKGRvdF9wbG90X2RmX21lbHRlZClbMl0gPC0gImlkZW50aXR5Igpjb2xuYW1lcyhkb3RfcGxvdF9kZl9tZWx0ZWQpWzNdIDwtICJyYXdfbnVtYmVyIgoKIyMgbWVyZ2UgdG9nZXRoZXIKaWRlbnRpY2FsKGRvdF9wbG90X2RmX21lbHRlZCRjbHVzdGVyLCBkb3RfcGxvdF9kZl9wY19tZWx0ZWQkY2x1c3RlcikKZG90X3Bsb3RfbWVyZ2VkIDwtIGNiaW5kKGRvdF9wbG90X2RmX21lbHRlZCwgZG90X3Bsb3RfZGZfcGNfbWVsdGVkKQpkb3RfcGxvdF9tZXJnZWQgPC0gZG90X3Bsb3RfbWVyZ2VkWyxjKDEsMiwzLDYpXQoKIyMgcmVkZWZpbmUgb3JkZXIgb2YgY2x1c3RlcnMKZG90X3Bsb3RfbWVyZ2VkJGNsdXN0ZXIgPC0gZmFjdG9yKHggPSBkb3RfcGxvdF9tZXJnZWQkY2x1c3RlciwgbGV2ZWxzID0gbXlfbGV2ZWxzX3NleCkKCiMjIHdoZXJlIHZhbHVlcyBhcmUgemVybywgYWRkIE5BCiMjIGZpbmQgd2VsbHMgd2hlcmUgaXQncyB6ZXJvCnplcm9fdmFsdWVzIDwtIGRvdF9wbG90X21lcmdlZCR2YWx1ZSA9PSAwCmRvdF9wbG90X21lcmdlZCR2YWx1ZVt6ZXJvX3ZhbHVlc10gPC0gTkEKCiMjIGFsc28gZG8gZm9yIHJhdyBudW1iZXIKemVyb192YWx1ZXMgPC0gZG90X3Bsb3RfbWVyZ2VkJHJhd19udW1iZXIgPT0gMApkb3RfcGxvdF9tZXJnZWQkcmF3X251bWJlclt6ZXJvX3ZhbHVlc10gPC0gTkEKCiMjIHJlb3JkZXIgeCBheGlzOgpteV9sZXZlbHNfZ2Vub3R5cGUgPC0gYygiR0NTS08tb29tIiwgIkdDU0tPLTI5IiwgIkdDU0tPLTIiLCAiR0NTS08tMTkiLCAiR0NTS08tMyIsICJHQ1NLTy0yMSIsICJHQ1NLTy0xMyIsICJHQ1NLTy0yOCIsICJHQ1NLTy0xMF84MjAiLCAiR0NTS08tMTciLCAiR0NTS08tMjAiLCAiV1QiLCAiV1RfMTBYIikKCmRvdF9wbG90X21lcmdlZCRpZGVudGl0eSA8LSBmYWN0b3IoeCA9IGRvdF9wbG90X21lcmdlZCRpZGVudGl0eSwgbGV2ZWxzID0gbXlfbGV2ZWxzX2dlbm90eXBlKQpgYGAKCnBsb3QKYGBge3IsIGZpZy53aWR0aCA9IDYsIGZpZy5oZWlnaHQ9IDd9CiMjIHBsb3QKZG90X3Bsb3RfaWRlbnRpdHkgPC0gZ2dwbG90KGRvdF9wbG90X21lcmdlZCwgYWVzKHkgPSBmYWN0b3IoY2x1c3RlciksIHggPSBmYWN0b3IoaWRlbnRpdHkpKSkgKwogICAgICAjIyBtYWtlIGludG8gYSBkb3QgcGxvdAogICAgICBnZW9tX3BvaW50KGFlcyhjb2xvdXI9dmFsdWUsIHNpemU9cmF3X251bWJlcikpICsgCiAgICAgIHNjYWxlX2NvbG9yX2dyYWRpZW50KGxvdz0iYmx1ZSIsIGhpZ2g9InJlZCIsIGxpbWl0cz1jKCAwLCBtYXgoZG90X3Bsb3RfZGZfcGNfbWVsdGVkJHZhbHVlKSksIG5hLnZhbHVlPSJ3aGl0ZSIpICsKICAgICAgI2NoYW5nZSB0aGUgY29sb3VycwogICAgICBzY2FsZV9jb2xvdXJfdmlyaWRpcyhvcHRpb24gPSAiaW5mZXJubyIsIGd1aWRlID0gImNvbG91cmJhciIsIG5hLnZhbHVlPSJ3aGl0ZSIpICsKICAgICAgdGhlbWVfY2xhc3NpYygpICsKICAgICAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvcj1lbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3I9ZWxlbWVudF9ibGFuaygpLCB0ZXh0PWVsZW1lbnRfdGV4dChzaXplPTE2LCAgZmFtaWx5PSJBcmlhbCIpKSArCiAgICAgIHlsYWIoIkNsdXN0ZXIiKSArCiAgICAgIHhsYWIoIklkZW50aXR5IikgKwogICAgICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT0xMiwgYW5nbGU9NDUsIGhqdXN0PTEsIHZqdXN0PTEpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT0xMiwpLCBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgcGxvdC5tYXJnaW4gPSB1bml0KGMoMSwzLDEsMyksICJsaW5lcyIpKSArCiAgICAjIyBhbm5vdGF0ZSBtYWxlcwogICAgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdCA9IDUuNSkpICsKICAgICMjIGFubm90YXRlIGZlbWFsZXMKICAgIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQgPSAyMC41KSkgKwogICAgIyMgYW5ub3RhdGUgcGhlbm8gMQogICAgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdCA9IDQuNSkpICsKICAgICMjIGFubm90YXRlIHBoZW5vIDIKICAgIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQgPSA1LjUpKSArICAgIAogICAgIyMgYW5ub3RhdGUgcGhlbm8gMwogICAgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdCA9IDcuNSkpICsKICAgICMjIGFubm90YXRlIHBoZW5vIDQKICAgIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQgPSAxMS41KSkKCiMjIHByaW50CnByaW50KGRvdF9wbG90X2lkZW50aXR5KQpgYGAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyBTYXZlIGFuZCBFeHBvcnQgey50YWJzZXR9CgpzYXZlIGVudmlyb25tZW50CmBgYHtyfQojIyBUaGlzIHNhdmVzIGV2ZXJ5dGhpbmcgaW4gdGhlIGdsb2JhbCBlbnZpcm9ubWVudCBmb3IgZWFzeSByZWNhbGwgbGF0ZXIKI3NhdmUuaW1hZ2UoZmlsZSA9ICJHQ1NLT19TZXhfQnJhbmNoX0FuYWx5c2lzLlJEYXRhIikKI2xvYWQoZmlsZSA9ICJHQ1NLT19TZXhfQnJhbmNoX0FuYWx5c2lzLlJEYXRhIikKYGBgCgpzYXZlIG1vZHVsZXMKYGBge3J9CiNnZW5lX21vZHVsZV9kZl9zZXgKd3JpdGUuY3N2KGdlbmVfbW9kdWxlX2RmX3NleCwgZmlsZSA9ICIuLi9kYXRhX3RvX2V4cG9ydC9nZW5lX21vZHVsZV9kZl9zZXguY3N2IikKI3NhdmUocGJfMzBrX3NleF9maWx0ZXJlZCwgcGJfc2V4X2ZpbHRlcmVkLCBmaWxlID0gIlBhcnRfMl9pbnB1dC5SZGF0YSIpCmBgYAoKU2F2ZSBvYmplY3QocykKYGBge3J9CiMjIHNhdmUgaW50ZWdyYXRlZCBvYmplY3QgdG8gZmlsZQojc2F2ZVJEUyh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleCwgZmlsZSA9ICIuLi9kYXRhX3RvX2V4cG9ydC90ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleC5wcm9jZXNzZWQuUkRTIikgCiMjIHJlc3RvcmUgdGhlIG9iamVjdAojdGVueC5tdXRhbnQuaW50ZWdyYXRlZCA8LSByZWFkUkRTKCIuLi9kYXRhX3RvX2V4cG9ydC90ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleC5wcm9jZXNzZWQuUkRTIikKYGBgCgojIEFwcGVuZGl4IHsudGFic2V0fQoKIyMjIFVzZWZ1bCBpbmZvCgpgYGB7cn0KIyMgVGhlIHRyZWUgZm9yIG1vbm9jbGUgaXMgbG9jYXRlZCBoZXJlOgojIG1vbm9jbGUub2JqZWN0QHByaW5jaXBhbF9ncmFwaF9hdXhbWyJVTUFQIl1dJGRwX21zdCAKIyMgc2VlIG1vcmUgaW5mbyBiZWxvdyBpbiBnZXRBbnl3aGVyZShsZWFybl9ncmFwaCkKIyMgaW4gb3JkZXIgdG8gZ2V0IGEgcGxvdHRhYmxlIGRhdGFmcmFtZSBvZiB0aGlzOgojdGVzdCA8LSBhcy5kYXRhLmZyYW1lKHQoYXMuZGF0YS5mcmFtZShtb25vY2xlLm9iamVjdEBwcmluY2lwYWxfZ3JhcGhfYXV4W1siVU1BUCJdXSRkcF9tc3QpKSkKI2dncGxvdCh0ZXN0LCBhZXMoeCA9IERJTVVNQVBfMSwgeSA9IERJTVVNQVBfMikpICsgZ2VvbV9wb2ludCgpCgojIyB0aGUgY3VydmVzIGZvciBzbGluZ3Nob3QgYXJlIGxvY2F0ZWQgaGVyZToKI2FzLmRhdGEuZnJhbWUoY3J2MUBjdXJ2ZXMkY3VydmUxJHMpCiMjIHNvIGEgcGxvdCBjYW4gYmUgbWFkZSBieToKI2dncGxvdChhcy5kYXRhLmZyYW1lKGNydjFAY3VydmVzJGN1cnZlMyRzKSwgYWVzKHg9IERJTVVNQVBfMSwgeSA9IERJTVVNQVBfMikpICsgZ2VvbV9saW5lKCkKYGBgCgoKIyMjIEZ1bmN0aW9ucyBJbmZvCgpgYGB7cn0KU2V1cmF0Ojo6RG9IZWF0bWFwCmBgYAoKYGBge3J9Cm1vbm9jbGU6OjpwbG90X3BzZXVkb3RpbWVfaGVhdG1hcApgYGAKCmBgYHtyfQojIyB0byB1bmRlcnN0YW5kIGhvdyB0aGUgbGluZSBpcyBzdG9yZWQKZ2V0QW55d2hlcmUobGVhcm5fZ3JhcGgpCmBgYAoKCmBgYHtyfQpnZXRBbnl3aGVyZShhZ2dyZWdhdGVfZ2VuZV9leHByZXNzaW9uKQpgYGAKCnNvIGVzc2VudGlhbGx5IGl0IGZpcnN0IHRha2VzIHRoZSBjb3VudHMgbWF0cml4IGFuZCBzdWJzZXRzIGl0IGJ5IHlvdXIgZ2VuZSBncm91cHMsIHRoZW4gaXQgc3VtcyB0aGUgdmFsdWVzIC0gaWYgeW91IHNwZWNpZnkgc2NhbGUgdGhlbiBpdCB3aWxsIGNhbGN1bGF0ZSB0aGUgeiBzY29yZSBvZiB0aGUgdHJhbnNmb3JtZWQgZGF0YWZyYW1lIAoKCgoKCgoKIyMgQS4gRGlmZnVzaW9uIE1hcAoKY29uc3RydWN0IG1hcApgYGB7cn0KIyMgY29uc3RydWN0IGRpZmZ1c2lvbiBtYXAKIyMgaHR0cDovL3d3dy5iaW9jb25kdWN0b3Iub3JnL3BhY2thZ2VzL2RldmVsL2Jpb2MvdmlnbmV0dGVzL3NsaW5nc2hvdC9pbnN0L2RvYy92aWduZXR0ZS5odG1sCiMjIGlucHV0IGlzIGEgdHJhbnNmb3JtZWQgZXhwcmVzc2lvbiBtYXRyaXggKGdlbmVzIGFzIGNvbHMgYW5kIGNlbGxzIGFzIHJvd3MpCmRtIDwtIERpZmZ1c2lvbk1hcCh0KGFzLmRhdGEuZnJhbWUodGVueC5tdXRhbnQuaW50ZWdyYXRlZC5zZXhAYXNzYXlzJGludGVncmF0ZWRAZGF0YSkpKQoKIyMgZXh0cmFjdCBtZXRhIGRhdGEgZm9yIHBsb3R0aW5nCmRmX21ldGFfZGF0YSA8LSAoYXMuZGF0YS5mcmFtZSh0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGEpKQoKIyMgbWFrZSBjb21iaW5lZCBkYXRhZnJhbWUKcmQyIDwtIGFzLmRhdGEuZnJhbWUoY2JpbmQoREMxID0gZG0kREMxLCBEQzIgPSBkbSREQzIsIGlkZW50aXR5ID0gYXMuZmFjdG9yKGFzLmNoYXJhY3Rlcih0ZW54Lm11dGFudC5pbnRlZ3JhdGVkLnNleEBtZXRhLmRhdGEkcG9zdF9pbnRlZ3JhdGlvbl9jbHVzdGVycykpKSkKCiMjIHBsb3QKZ2dwbG90KHJkMiwgYWVzKHggPSBEQzEsIHkgPSBEQzIsIGNvbG91ciA9IGFzLmNoYXJhY3RlcihpZGVudGl0eSkpKSArIGdlb21fcG9pbnQoc2l6ZSA9IDEpICsgCiAgdGhlbWUoYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKSArIAogIHRoZW1lX2NsYXNzaWMoKQpgYGAKCgoKCgoKCmBgYHtyLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDN9CiMjIG1ha2UgYSBkZW5zaXR5IHBsb3QgZm9yIHJlYWwgdGltZSBjb3JyZWxhdGlvbnMgdXNpbmcga2FzaWEgZGF0YQojIyBtYWtlIGFuIGFubm90YXRpb24gZGF0YWZyYW1lCmFubm9fcmVhbF90aW1lIDwtIGRhdGEuZnJhbWUobW9ub2NsZS5vYmplY3RAY29sRGF0YSRjbHVzdGVyX2NvbG91cnNfZmlndXJlLCBtb25vY2xlLm9iamVjdEBjb2xEYXRhJHB0LCBtb25vY2xlLm9iamVjdEBjb2xEYXRhJFByZWRpY3Rpb24uU3BlYXJtYW4uX0thc2lhLCByb3cubmFtZXMgPSByb3duYW1lcyhtb25vY2xlLm9iamVjdEBjb2xEYXRhKSkKbmFtZXMoYW5ub19yZWFsX3RpbWUpIDwtIGMoInNleCIsICJQc2V1ZG90aW1lIiwgInJlYWxfdGltZSIpCgojIyBjaGFuZ2UgdGhlIG9yZGVyIG9mIHRoZSBjb2xzIChjZWxscykgaW4gZGF0YSBmcmFtZQpjb2wub3JkZXIgPC0gcm93bmFtZXMoYW5ub19yZWFsX3RpbWVbd2l0aChhbm5vX3JlYWxfdGltZSwgb3JkZXIoc2V4LCBQc2V1ZG90aW1lKSksIF0pCmFubm9fcmVhbF90aW1lIDwtIGFubm9fcmVhbF90aW1lW2NvbC5vcmRlcixdCgojIyBhZGQgYW4gIm9yZGVyIiBjb2wgdG8gdGhlIGRhdGFmcmFtZSB0byBhc3Npc3QgaW4gcGxvdHRpbmcKYW5ub19yZWFsX3RpbWUkb3JkZXIgPC0gYygxOm5yb3coYW5ub19yZWFsX3RpbWUpKQoKIyMjIyBwbG90IGRlbnNpdHkgcGxvdCB4CmRlbnMxIDwtIGdncGxvdChhbm5vX3JlYWxfdGltZSwgYWVzKHggPSBvcmRlciwgZmlsbCA9IGFzLmZhY3RvcihyZWFsX3RpbWUpKSkgKyAKICAgICAgICAgICAgICAgIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuMikgKwogICAgICAgICAgICAgICAgI3RoZW1lX3ZvaWQoKSArIAogICAgICAgICAgICAgICAgI3RoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKICAgICAgICAgICAgICAgICMjIGFkZCBhbm5vdGF0aW9ucyBmb3Igc2V4CiAgICAgIGdlb21fcmVjdChkYXRhID0gY2x1c3Rlcl9hbm5vLCBtYXBwaW5nPWFlcyh4bWluPXgxLCB4bWF4PXgyLCB5bWluPXkxLCB5bWF4PXkyLCBmaWxsPU1lZGlhbl9Qc2V1ZG90aW1lX29mX0NsdXN0ZXIpLCBpbmhlcml0LmFlcyA9IEZBTFNFKSArCiAgICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhvcHRpb24gPSAicGxhc21hIikgKwogICMjIGZsaXAgY29vcmRpbmF0ZXMgCiAgIyMgZ2VvbXMgYmVsb3cgd2lsbCB1c2UgYW5vdGhlciBjb2xvciBzY2FsZQogICAgbmV3X3NjYWxlX2ZpbGwoKSArCiAgICBnZW9tX3JlY3QoZGF0YSA9IGNsdXN0ZXJfYW5ubywgbWFwcGluZz1hZXMoeG1pbj1CeDEsIHhtYXg9QngyLCB5bWluPUJ5MSwgeW1heD1CeTIsIGZpbGw9SWRlbnRpdHkpLCBpbmhlcml0LmFlcyA9IEZBTFNFKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJNYWxlIiA9IiMwMTZjMDAiLCAiRmVtYWxlIj0iI2E1MmIxZSIsICJBc2V4dWFsIj0gIiMwMDUyYzUiLCAiQ29tbWl0dGVkIiA9ICIjZjJlYjIzIikpCgpkZW5zMQoKYGBgCgoKCiMjIyBUTyBQVVQgQkFDSyBJTiAKCiMjIyBBLiAKClB1dCB0aGlzIGluIGFmdGVyIHlvdSBoYXZlIGRlY2lkZWQgd2hhdCBpcyBhY3R1YWxseSBtYWxlIGFuZCBmZW1hbGUsIGFsc28gYWRkIGEgaGVhdG1hcCB2ZXJzaW9uIGJlbG93IGFuZCBmaWd1cmUgb3V0IGV4cHJlc3Npb24gdmFsdWVzIChlLmcuIGl0J3MgYSBaLXNjb3JlIGF0IHRoZSBtb21lbnQpCgpgYGB7ciwgZmlnLmhlaWdodCA9IDEwLCBmaWcud2lkdGggPSAxMH0KICAgICMjIHN1YnNldCBtYWxlcyBhbmQgZmVtYWxlcwojIyBmcm9tIHRoZSBtZXJnZSBzY3JpcHQ6CiNtYWxlX2NsdXN0ZXJzIDwtIGMoIjIyIiwgIjE4IiwgIjkiLCAiMTYiKQojZmVtYWxlX2NsdXN0ZXJzIDwtIGMoIjE5IiwiMjQiLCIyMCIsIjMiKQoKIyMgc3Vic2V0IG1hbGVzIAptdXRhbnRfbWFsZV9zZXVyYXQgPC0gc3Vic2V0KG11dGFudF9vbmx5X3NldXJhdCwgaWRlbnRzID0gYygiMjIiLCAiMTgiLCAiOSIsICIxNiIpKQoKIyMgc3Vic2V0IGZlbWFsZXMgPC0gCm11dGFudF9mZW1hbGVfc2V1cmF0IDwtIHN1YnNldChtdXRhbnRfb25seV9zZXVyYXQsIGlkZW50cyA9IGMoIjE5IiwiMjQiLCIyMCIsIjMiKSkKCiAgICMjIG1jYSBkYXRhc2V0IG9mIGNvcmUgZ2VuZXMKCiMjIHJlYWQgaW4gZGF0YQpkZl9tY2FfY29yZV9nZW5lcyA8LSBhcy5kYXRhLmZyYW1lKHJlYWQuY3N2KCIuLi9kYXRhL1JlZmVyZW5jZS9tY2FfY29yZV9nZW5lcy5jc3YiLGhlYWRlciA9IFRSVUUpKQoKIyMgc3Vic2V0IG1hbGUgY29yZSBnZW5lcwptY2FfbWFsZV9jb3JlX2dlbmVzIDwtIGRmX21jYV9jb3JlX2dlbmVzW3doaWNoKGRmX21jYV9jb3JlX2dlbmVzJFVuaXF1ZV9Db3JlID09ICJNYWxlIiksIF0kZmVhdHVyZV9zeW1ib2wKIyMgY2hhbmdlIHVuZGVyc2NvcmUgdG8gZGFzaAptY2FfbWFsZV9jb3JlX2dlbmVzIDwtIGdzdWIoIl8iLCAiLSIsIG1jYV9tYWxlX2NvcmVfZ2VuZXMpCm1jYV9tYWxlX2NvcmVfZ2VuZXMgPC0gbWNhX21hbGVfY29yZV9nZW5lc1t3aGljaChtY2FfbWFsZV9jb3JlX2dlbmVzICVpbiUgcm93bmFtZXMobXV0YW50X21hbGVfc2V1cmF0QGFzc2F5cyRSTkFAZGF0YSkpXQoKIyMgc3Vic2V0IGZlbWFsZSBjb3JlIGdlbmVzCm1jYV9mZW1hbGVfY29yZV9nZW5lcyA8LSBkZl9tY2FfY29yZV9nZW5lc1t3aGljaChkZl9tY2FfY29yZV9nZW5lcyRVbmlxdWVfQ29yZSA9PSAiRmVtYWxlIiksIF0kZmVhdHVyZV9zeW1ib2wKIyMgY2hhbmdlIHVuZGVyc2NvcmUgdG8gZGFzaAptY2FfZmVtYWxlX2NvcmVfZ2VuZXMgPC0gZ3N1YigiXyIsICItIiwgbWNhX2ZlbWFsZV9jb3JlX2dlbmVzKQptY2FfZmVtYWxlX2NvcmVfZ2VuZXMgPC0gbWNhX2ZlbWFsZV9jb3JlX2dlbmVzW3doaWNoKG1jYV9mZW1hbGVfY29yZV9nZW5lcyAlaW4lIHJvd25hbWVzKG11dGFudF9mZW1hbGVfc2V1cmF0QGFzc2F5cyRSTkFAZGF0YSkpXQoKICAgICMjIHBsb3QKCiMgUEJBTktBLTA4MjgwMDAgICAgICAgICBHQ1NLTy0zICBHRDEKCiMgUEJBTktBLTEzMDI3MDAgICAgICAgR0NTS08tb29tICBNRDEgCiMgUEJBTktBLTE0NDc5MDAgICAgICAgIEdDU0tPLTI5ICBNRDIKIyBQQkFOS0EtMDEwMjQwMCAgICAgICAgIEdDU0tPLTIgIE1EMyAKIyBQQkFOS0EtMDcxNjUwMCAgICAgICAgR0NTS08tMTkgIE1ENCAKIyBQQkFOS0EtMDQxMzQwMCAgICBHQ1NLTy0xMF84MjAgIE1ENQoKIyBQQkFOS0EtMTQ1NDgwMCAgICAgICAgR0NTS08tMjEgIEZEMQojIFBCQU5LQS0wOTAyMzAwICAgICAgICBHQ1NLTy0xMyAgRkQyCiMgUEJBTktBLTE0MTgxMDAgICAgICAgIEdDU0tPLTE3ICBGRDMgICAKIyBQQkFOS0EtMTQzNTIwMCAgICAgICAgR0NTS08tMjAgIEZENCAKCiMjIHJlb3JkZXIgdGhlIGxldmVscyBzbyB5b3UgY2FuIHBsb3QgdGhlIGNsdXN0ZXJzIGFzIHlvdSB3aXNoCiNteV9sZXZlbHNfbWFsZSA8LSBjKCJHQ1NLTy0zIiwgIkdDU0tPLTIiLCAiR0NTS08tMTkiLCAiR0NTS08tMTBfODIwIiwgIkdDU0tPLTIxIiwgIkdDU0tPLTEzIiwgIkdDU0tPLTE3IiwgIkdDU0tPLTIwIikKbXlfbGV2ZWxzX21hbGUgPC0gYygiZ2QxIiwgIm1kMyIsICJtZDQiLCAibWQ1IiwgImZkMSIsICJmZDIiLCAiZmQzIiwgImZkNCIpCiNteV9sZXZlbHNfZmVtYWxlIDwtIGMoIkdDU0tPLTIxIiwgIkdDU0tPLTEzIiwgIkdDU0tPLTE3IiwgIkdDU0tPLTIwIiwgIkdDU0tPLW9vbSIsICJHQ1NLTy0yOSIsICJHQ1NLTy0yIiwgIkdDU0tPLTE5IiwgIkdDU0tPLTEwXzgyMCIpCm15X2xldmVsc19mZW1hbGUgPC0gYygiZ2QxIiwgImZkMSIsICJmZDIiLCAiZmQzIiwgImZkNCIsICJtZDEiLCAibWQyIiwgIm1kMyIsICJtZDQiLCAibWQ1IikKCiMjIHJlb3JkZXIgdGhlIGxldmVscwptdXRhbnRfbWFsZV9zZXVyYXRAbWV0YS5kYXRhJGlkZW50aXR5X25hbWVfdXBkYXRlZCA8LSBmYWN0b3IoeCA9IG11dGFudF9tYWxlX3NldXJhdEBtZXRhLmRhdGEkaWRlbnRpdHlfbmFtZV91cGRhdGVkLCBsZXZlbHMgPSBteV9sZXZlbHNfbWFsZSkKI211dGFudF9tYWxlX3NldXJhdEBtZXRhLmRhdGEkaWRlbnRpdHlfdXBkYXRlZCA8LSBmYWN0b3IoeCA9IG11dGFudF9tYWxlX3NldXJhdEBtZXRhLmRhdGEkaWRlbnRpdHlfdXBkYXRlZCwgbGV2ZWxzID0gbXlfbGV2ZWxzX21hbGUpCm11dGFudF9mZW1hbGVfc2V1cmF0QG1ldGEuZGF0YSRpZGVudGl0eV9uYW1lX3VwZGF0ZWQgPC0gZmFjdG9yKHggPSBtdXRhbnRfZmVtYWxlX3NldXJhdEBtZXRhLmRhdGEkaWRlbnRpdHlfbmFtZV91cGRhdGVkLCBsZXZlbHMgPSBteV9sZXZlbHNfZmVtYWxlKQojbXV0YW50X2ZlbWFsZV9zZXVyYXRAbWV0YS5kYXRhJGlkZW50aXR5X3VwZGF0ZWQgPC0gZmFjdG9yKHggPSBtdXRhbnRfZmVtYWxlX3NldXJhdEBtZXRhLmRhdGEkaWRlbnRpdHlfdXBkYXRlZCwgbGV2ZWxzID0gbXlfbGV2ZWxzX2ZlbWFsZSkKCiMjIHBsb3QgbWFsZQpkb3RfcGxvdF9tYWxlIDwtIERvdFBsb3QobXV0YW50X21hbGVfc2V1cmF0LCBhc3NheSA9ICJSTkEiLCBmZWF0dXJlcyA9IG1jYV9tYWxlX2NvcmVfZ2VuZXMsIGdyb3VwLmJ5ID0gImlkZW50aXR5X2NvbWJpbmVkIikgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgIyBjaGFuZ2UgYXBwZWFyYW5jZSBhbmQgcmVtb3ZlIGF4aXMgZWxlbWVudHMsIGFuZCBtYWtlIHJvb20gZm9yIGFycm93cwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTYsIGFuZ2xlID0gNDUsIGhqdXN0PTEsdmp1c3Q9MSwgZmFtaWx5ID0gIkFyaWFsIiksIHRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTYsIGZhbWlseT0iQXJpYWwiKSwgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsIGxlZ2VuZC5ib3ggPSAidmVydGljYWwiLCBwbG90LnRpdGxlID0gZWxlbWVudF9ibGFuaygpLCBwbG90Lm1hcmdpbiA9IHVuaXQoYygxLDMsMSwzKSwgImxpbmVzIikpICsKICAjY2hhbmdlIHRoZSBjb2xvdXJzCiAgc2NhbGVfY29sb3VyX3ZpcmlkaXMob3B0aW9uID0gImluZmVybm8iLCBndWlkZSA9ICJjb2xvdXJiYXIiLCBuYS52YWx1ZT0id2hpdGUiLCBiZWdpbiA9IDAsIGVuZCA9IDEsIGRpcmVjdGlvbiA9IDEpICsKICAjIyBjaGFuZ2UgeCBheGlzIGxhYmVsCiAgbGFicyh4ID0gIk1DQSBDb3JlIEdlbmVzIiwgeSA9ICJHZW5vdHlwZSIsIHRpdGxlID0gIkV4cHJlc3Npb24gb2YgTWFsZSBNQ0EgQ29yZSBHZW5lcyBpbiBNYWxlIE11dGFudCBDZWxscyIpICsKICAjIyBjaGFuZ2UgbGFiZWwgb24gYm90dG9tIG9mIHBsb3Qgc28gd2UgY2FuIGluZGljYXRlIG1hcmtlcnMKICAjc2NhbGVfeV9kaXNjcmV0ZShsYWJlbHMgPSBjKCJnZDEiLCAibWQzIiwgIm1kNCIsICJtZDUiLCAiZmQxIiwgImZkMiIsICJmZDMiLCAiZmQ0IikpICsKICBjb29yZF9mbGlwKCkKCiMjIHZpZXcKcHJpbnQoZG90X3Bsb3RfbWFsZSkKCgojIyBwbG90IGZlbWFsZQpkb3RfcGxvdF9mZW1hbGUgPC0gRG90UGxvdChtdXRhbnRfZmVtYWxlX3NldXJhdCwgYXNzYXkgPSAiUk5BIiwgZmVhdHVyZXMgPSBtY2FfZmVtYWxlX2NvcmVfZ2VuZXMsIGdyb3VwLmJ5ID0gImlkZW50aXR5X2NvbWJpbmVkIikgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgIyBjaGFuZ2UgYXBwZWFyYW5jZSBhbmQgcmVtb3ZlIGF4aXMgZWxlbWVudHMsIGFuZCBtYWtlIHJvb20gZm9yIGFycm93cwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTYsIGFuZ2xlID0gNDUsIGhqdXN0PTEsdmp1c3Q9MSwgZmFtaWx5ID0gIkFyaWFsIiksIHRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTYsIGZhbWlseT0iQXJpYWwiKSwgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsIGxlZ2VuZC5ib3ggPSAidmVydGljYWwiLCBwbG90LnRpdGxlID0gZWxlbWVudF9ibGFuaygpLCBwbG90Lm1hcmdpbiA9IHVuaXQoYygxLDMsMSwzKSwgImxpbmVzIikpICsKICAjY2hhbmdlIHRoZSBjb2xvdXJzCiAgc2NhbGVfY29sb3VyX3ZpcmlkaXMob3B0aW9uID0gImluZmVybm8iLCBndWlkZSA9ICJjb2xvdXJiYXIiLCBuYS52YWx1ZT0id2hpdGUiLCBiZWdpbiA9IDAsIGVuZCA9IDEsIGRpcmVjdGlvbiA9IDEpICsKICAjIyBjaGFuZ2UgeCBheGlzIGxhYmVsCiAgbGFicyh4ID0gIk1DQSBDb3JlIEdlbmVzIiwgeSA9ICJHZW5vdHlwZSIsIHRpdGxlID0gIkV4cHJlc3Npb24gb2YgRmVtYWxlIE1DQSBDb3JlIEdlbmVzIGluIEZlYWxlIE11dGFudCBDZWxscyIpICsKICAjIyBjaGFuZ2UgbGFiZWwgb24gYm90dG9tIG9mIHBsb3Qgc28gd2UgY2FuIGluZGljYXRlIG1hcmtlcnMKICAjc2NhbGVfeV9kaXNjcmV0ZShsYWJlbHMgPSBjKCJmZDEiLCAiZmQyIiwgImZkMyIsICJmZDQiLCJtZDEiLCAibWQyIiwgICJtZDMiLCAibWQ0IiwgIm1kNSIpKSArCmNvb3JkX2ZsaXAoKQoKIyMgdmlldwpwcmludChkb3RfcGxvdF9mZW1hbGUpCmBgYAoKc2F2ZQpgYGB7cn0KZ2dzYXZlKCIuLi9pbWFnZXNfdG9fZXhwb3J0L0dDU0tPX3NleGJyYW5jaF9kb3RfbWFsZS5wbmciLCBwbG90ID0gZG90X3Bsb3RfbWFsZSwgZGV2aWNlID0gInBuZyIsIHBhdGggPSBOVUxMLCBzY2FsZSA9IDEsIHdpZHRoID0gMzAsIGhlaWdodCA9IDYwLCB1bml0cyA9ICJjbSIsIGRwaSA9IDMwMCwgbGltaXRzaXplID0gVFJVRSkKCmdnc2F2ZSgiLi4vaW1hZ2VzX3RvX2V4cG9ydC9HQ1NLT19zZXhicmFuY2hfZG90X2ZlbWFsZS5wbmciLCBwbG90ID0gZG90X3Bsb3RfZmVtYWxlLCBkZXZpY2UgPSAicG5nIiwgcGF0aCA9IE5VTEwsIHNjYWxlID0gMSwgd2lkdGggPSAzMCwgaGVpZ2h0ID0gNjAsIHVuaXRzID0gImNtIiwgZHBpID0gMzAwLCBsaW1pdHNpemUgPSBUUlVFKQpgYGAKCgoKCgoKCgpQaGVhdG1hcCB2ZXJzaW9uIG9mIGhlYXRtYXAgb2xkIGNvbGQgdG8gbWFrZSBtYWluIGhlYXRtYXAgKE5PVCBSVU4pCgpNYWtlIGFubm90YXRpb25zIHRvIGFkZCB0byB0aGUgaGVhdG1hcApgYGB7cn0KIyMgY2hhbmdlIG5hbWVzIGZvciByb3cgbmFtZXMgdG8gaW5jbHVkZSAibW9kdWxlICIgYXQgdGhlIGJlZ2luaW5nIG9mIHRoZW0Kcm93Lm5hbWVzKGFnZ19tYXQpIDwtIHN0cmluZ3I6OnN0cl9jKCJNb2R1bGUgIiwgcm93Lm5hbWVzKGFnZ19tYXQpKQoKIyMgYWRkIG51bWJlciBvZiBjZWxscyB0byB0aGUgcm93bmFtZXMgZm9yIHRoZSBtb2R1bGUKZm9yKGkgaW4gc2VxX2Fsb25nKGdlbmVzX3Blcl9tb2R1bGUkRnJlcSkpewogIHJvdy5uYW1lcyhhZ2dfbWF0KVtpXSA8LSBzdHJpbmdyOjpzdHJfYyhyb3cubmFtZXMoYWdnX21hdClbaV0sIiAobiA9ICIgLGdlbmVzX3Blcl9tb2R1bGUkRnJlcVtpXSwgIikiKQp9CgojIyBjcmVhdGUgYW5ub3RhdGlvbiBvZiBjbHVzdGVycyBmb3IgcGhlYXRtYXA6CmNsdXN0ZXJfYW5ubyA8LSBkYXRhLmZyYW1lKGNsdXN0ZXIgPSB1bmlxdWUoY29sRGF0YShtb25vY2xlLm9iamVjdCkkc2V1cmF0X2NsdXN0ZXJzKSkKcm93Lm5hbWVzKGNsdXN0ZXJfYW5ubykgPC0gY2x1c3Rlcl9hbm5vJGNsdXN0ZXIKCiMjIGNsdXN0ZXJzIHdlcmUgZGVmaW5lZCBlYXJsaWVyIGFzOgptYWxlX2NsdXN0ZXJzIDwtIGMoIjEzIiwgIjUiLCAiMTEiLCAiMjUiLCAiMSIsICIxNyIsICIxMCIsICIyNCIsICIxNCIsICIyNyIsICIxOSIpCmZlbWFsZV9jbHVzdGVycyA8LSBjKCIxNiIsICIyMiIsICIyMyIsICIxNSIsICIyMSIsICIzMCIsICI0IiwgIjMiLCAiMTgiLCAiNyIsICI4IiwgIjYiLCAiMjAiLCAiMTIiLCAiMjYiKQphc2V4X2NsdXN0ZXJzIDwtIGMoIjAiLCAiOSIsICIyOCIsICIyIiwgIjI5IikKCiMjIGFkZCBpZGVudGl0aWVzIHRvIHRoZSBjb2x1bW4KY2x1c3Rlcl9hbm5vJGdyb3VwIDwtIE5BCmNsdXN0ZXJfYW5ubyRncm91cFt3aGljaChjbHVzdGVyX2Fubm8kY2x1c3RlciAlaW4lIGFzZXhfY2x1c3RlcnMpXSA8LSAiQXNleHVhbCIKY2x1c3Rlcl9hbm5vJGdyb3VwW3doaWNoKGNsdXN0ZXJfYW5ubyRjbHVzdGVyICVpbiUgbWFsZV9jbHVzdGVycyldIDwtICJNYWxlIgpjbHVzdGVyX2Fubm8kZ3JvdXBbd2hpY2goY2x1c3Rlcl9hbm5vJGNsdXN0ZXIgJWluJSBmZW1hbGVfY2x1c3RlcnMpXSA8LSAiRmVtYWxlIgpjbHVzdGVyX2Fubm8gPC0gY2x1c3Rlcl9hbm5vWyAsIDIsIGRyb3AgPSBGQUxTRV0KY2x1c3Rlcl9hbm5vCgojIyBhZGQgbWVkaWFuIHBzZXVkb3RpbWUgcGVyIGNsdXN0ZXIKIyMgaGVscCBoZXJlOgojIyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy81NDM2MDg1NS9jYWxjdWxhdGUtbWVhbi1mb3ItY29sdW1uLWdyb3VwZWQtYnktdmFsdWVzLW9mLXR3by1vdGhlci1jb2x1bW5zCiMjIG1ha2Ugc3Vic2V0dGVkIGRhdGFmcmFtZQpkZl9tZWRpYW5fcHQgPC0gbWV0YV9kYXRhX2RmWyAsYygicHQiLCAic2V1cmF0X2NsdXN0ZXJzIildCiMjIGFwcGx5IGFjcm9zcyBkYXRhZnJhbWUgdG8gZ2V0IG1lZGlhbgptZWFuLmRmMSA8LSB0YXBwbHkoZGZfbWVkaWFuX3B0JHB0LCBsaXN0KGRmX21lZGlhbl9wdCRzZXVyYXRfY2x1c3RlcnMpLCBtZWRpYW4pCm1lYW4uZGYyIDwtIGFzLmRhdGEuZnJhbWUoYXMudGFibGUobWVhbi5kZjEpKQpuYW1lcyhtZWFuLmRmMikgPC0gYygic2V1cmF0X2NsdXN0ZXJzIiwgInB0X01lZGlhbiIpCnJvd25hbWVzKG1lYW4uZGYyKSA8LSBtZWFuLmRmMiRzZXVyYXRfY2x1c3RlcnMKIyMgdG8gbWFrZSBlYWNoIHZhbHVlIGhhdmUgdGhlIG1lYW4gaW4gdGhlIE9HIGRhdGFmcmFtZQojbWVyZ2UoZGZfbWVkaWFuX3B0LCBtZWFuLmRmMikKIyMgYWRkIHRvIGFubm90YXRpb24gZGF0YWZyYW1lCmNsdXN0ZXJfYW5ubyA8LSBtZXJnZShjbHVzdGVyX2Fubm8sIG1lYW4uZGYyLCBieT0wKQoKIyMgYWRkIHJvd25hbWVzIHRvIGRhdGFmcmFtZQpyb3duYW1lcyhjbHVzdGVyX2Fubm8pIDwtIGNsdXN0ZXJfYW5ubyRSb3cubmFtZXMKIyMgc3Vic2V0IHRvIGhhdmUgb25seSBpbmZvIG9mIGludGVyZXN0CmNsdXN0ZXJfYW5ubyA8LSBjbHVzdGVyX2Fubm9bLGMoMiw0KV0KbmFtZXMoY2x1c3Rlcl9hbm5vKSA8LSBjKCJJZGVudGl0eSIsICJNZWRpYW5fUHNldWRvdGltZV9vZl9DbHVzdGVyIikKYGBgCgojIyMjIFdUIGNlbGxzIGJ5IG1vZHVsZXMgb3ZlciBwdCAoY2VudHJhbCBwYW5lbCkKCmBgYHtyLCBmaWcuaGVpZ2h0ID0gMTAsIGZpZy53aWR0aCA9IDEyfQojIyBtYWtlIGFubm90YXRpb24gY29sb3Vycwphbm5vdGF0aW9uX2NvbG91cnMgPC0gbGlzdChJZGVudGl0eSA9IGMoTWFsZT0iIzAxNmMwMCIsIEZlbWFsZT0iI2E1MmIxZSIsIEFzZXh1YWw9ICIjMDA1MmM1IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhbl9Qc2V1ZG90aW1lX29mX0NsdXN0ZXIgPSBtYWdtYSgxMiwgZGlyZWN0aW9uID0gMSkpCgojIyByZW9yZGVyIHRoZSBsZXZlbHMKIyMgbWFrZSBkZiBvZiBkYXRhCmFnZ19tYXRfZGYgPC0gYXMuZGF0YS5mcmFtZShhZ2dfbWF0KQojIyByZW1vdmUgbGV2ZWxzIGluIG15X2xldmVscyB0aGF0IGFyZSBub3QgcHJlc2VudCBoZXJlIC0gaS5lLiBjbHVzdGVycyB0aGF0IGFyZSBtaXNzaW5nIGJlY2F1c2UgdGhleSBhcmUgbm90IHJlcHJlc2VudGVkIGluIHRoZSAxMFggZGF0YQpteV9sZXZlbHNfMTB4X2RhdGEgPC0gbXlfbGV2ZWxzX3NleFt3aGljaChteV9sZXZlbHNfc2V4ICVpbiUgY29sbmFtZXMoYWdnX21hdF9kZikpXQojIyBzb3J0IHRoZSB2YWx1ZXMKYWdnX21hdF9kZiA8LSBhZ2dfbWF0X2RmWyAsKG1hdGNoKG15X2xldmVsc18xMHhfZGF0YSwgY29sbmFtZXMoYWdnX21hdF9kZikpKV0KCiMjIG9yZGVyIAojY2x1c3Rlcl9hbm5vIDwtIGNsdXN0ZXJfYW5ub1sobWF0Y2gobXlfbGV2ZWxzXzEweF9kYXRhLCByb3duYW1lcyhjbHVzdGVyX2Fubm8pKSksIF0KCiMjIHJlb3JkZXIgY29sdW1ucyAKIyMgZmlyc3QsIG9yZGVyIHRoZSBhbm5vdGF0aW9uCmNsdXN0ZXJfYW5ubyA8LSBjbHVzdGVyX2Fubm9bd2l0aChjbHVzdGVyX2Fubm8sIG9yZGVyKElkZW50aXR5LCBNZWRpYW5fUHNldWRvdGltZV9vZl9DbHVzdGVyKSksXQoKIyMgcmVtb3ZlIHRoZSBOQXMgZnJvbSB0aGlzCmNsdXN0ZXJfYW5ubyA8LSBjbHVzdGVyX2Fubm9bY29tcGxldGUuY2FzZXMoY2x1c3Rlcl9hbm5vKSxdCgphZ2dfbWF0X2RmIDwtIGFnZ19tYXRfZGZbICxtYXRjaChyb3duYW1lcyhjbHVzdGVyX2Fubm8pLCBjb2xuYW1lcyhhZ2dfbWF0X2RmKSldCgojIyBwbG90IGhlYXRtYXAKcGhlYXRtYXA6OnBoZWF0bWFwKGFnZ19tYXRfZGYsIAogICAgICAgICAgICAgICAgICAgc2NhbGU9InJvdyIsCiAgICAgICAgICAgICAgICAgICBjbHVzdGVyX2NvbHMgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJpbmdfbWV0aG9kPSJ3YXJkLkQyIiwgCiAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uX2NvbCA9IGNsdXN0ZXJfYW5ubywgCiAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uX2NvbG9ycyA9IGFubm90YXRpb25fY29sb3VycywgCiAgICAgICAgICAgICAgICAgICBjdXRyZWVfcm93cyA9IDEyKQoKIywgZ2Fwc19jb2wgPSBjKDI4LDI5LDM3KQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0ID0gNywgZmlnLndpZHRoID0gMTB9CiNyb3cubmFtZXMoYWdnX21hdCkgPC0gZmFjdG9yKHJvdy5uYW1lcyhhZ2dfbWF0KSwgbGV2ZWxzID0gcm93Lm5hbWVzKGFnZ19tYXQpW21vZHVsZV9kZW5kcm8kb3JkZXJdKQoKIyMgcGxvdCBoZWF0bWFwCiNwaGVhdG1hcDo6cGhlYXRtYXAoYWdnX21hdF9kZiwgCiAgIyAgICAgICAgICAgICAgICAgIHNjYWxlPSJjb2x1bW4iLAogICMgICAgICAgICAgICAgICAgICBjbHVzdGVyX2NvbHMgPSBUUlVFLAogICMgICAgICAgICAgICAgICAgICBjbHVzdGVyX3Jvd3MgPSBtb2R1bGVfZGVuZHJvLAogICMgICAgICAgICAgICAgICAgICAjY2x1c3RlcmluZ19tZXRob2Q9IndhcmQuRDIiLAogICMgICAgICAgICAgICAgICAgICBjdXRyZWVfcm93cyA9IDUsCiAgIyAgICAgICAgICAgICAgICAgIGFubm90YXRpb25fY29sID0gY2x1c3Rlcl9hbm5vLCAKICAjICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbl9jb2xvcnMgPSBhbm5vdGF0aW9uX2NvbG91cnMpICsgCiAgIyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikKYGBgCg==